Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > DLL написанная на Delphi для Excel


Автор: OleGator08 15.1.2008, 07:14
 Вот статья по теме  http://forum.vingrad.ru/faq/topic-156830.html про DLL для Excel, напис. на дельфях... Мне по работе надо свою физику (библиотеку вычисляемых свойств) написать людям в качестве надстройки для ехеля... Так вот, все бы ничего, считается все нормально, пользовался в том числе и описанными  функциями! Но никак не могу избавится от ошибки после окончания работы с ехелевским файлом, ошибкой памяти (сразу после закрытия Excel)... 

Runtime error 216 at ...

Код

Вот прост. ф-я определ. молекул. массы состава... Я ее уже и Double и Variant делал! Не помогает! 
Function f_MM(const vWp_v, vMM_v, vPL20_v: Variant):Variant; stdcall;
var
   i:Integer;
   rez: Double;
begin
 RangeToVector(vWp_v, Wpi); RangeToVector(vMM_v, MM_i); RangeToVector(vPL20_v, PL20_i);
//
  rez:= Calc_MM(Wpi, MM_i, PL20_i);
  f_MM:=DoubleToVar(rez);
//
end; // f_MM(vWp_v, vMM_v, vPL20_v: Variant):Double; stdcall;

Объявил в Exel как (для варианта уже, было и Double - не помогает):
Public Declare Function Молек_Масса Lib "TNGGLib.dll" _
Alias "f_MM" (МассДоля_i As Variant, _
               МолекМасса_i As Variant, _
               Плотность20_i As Variant) As Variant
  

Автор: MetalFan 15.1.2008, 12:44
ошибка в 17й строке)

Автор: OleGator08 15.1.2008, 13:37
Цитата(MetalFan @ 15.1.2008,  12:44)
ошибка в 17й строке)

если честно не понял, это была шутка или ответ... но очень расчитывал на помощь... времени катастрофически нет, а проблема висит, очень был бы благодарен за реальную помощь, без намеков а пару слов конкретно, можно примером...

Автор: VICTAR 15.1.2008, 13:48
Цитата(MetalFan @  15.1.2008,  12:44 Найти цитируемый пост)
ошибка в 17й строке) 

Цитата

Ошибка в 17й строке - Ну, нет тут телепатов, нет! Нужен пример кода с которым проблемы, иначе догадаться что вы там делаете невозможно!



Автор: OleGator08 15.1.2008, 15:29
Цитата(VICTAR @ 15.1.2008,  13:48)
Цитата

Ошибка в 17й строке - Ну, нет тут телепатов, нет! Нужен пример кода с которым проблемы, иначе догадаться что вы там делаете невозможно!

Пожалуй я не прав... Надо запрос не в Дельфи-форум а в Форум Excel VBA делать... сорри... Попробую там... Не в коде Дельфи баг, а в том, что Excel не обработает адекватно функцию dll, написанную на D6 и после закрытия Excel выдает ошибку использования памяти... А плюнуть на нее как то не хочется... А считает эта функция в Excel правильно!

=Молек_Масса(E4:E51;Фракции!B4:B51;Фракции!C4:C51) дает в ячейке 156.073 к примеру

Теперь записываем книгу xls, выходим из Excel и идет ошибка эта с попыткой отправки отладки в MS... Т.е. вопрос то в том, как Excel воспринимает подсунутые DLL? Что то там не так срастается, - конфликты с DLL на дельфях писанные...

Автор: MetalFan 15.1.2008, 17:18
Цитата(OleGator08 @  15.1.2008,  13:37 Найти цитируемый пост)
если честно не понял, это была шутка или ответ...

на какую помощь ты рассчитывал? что все кинуться повторять и отлавливать ошибку?
у многих нет на это времени.
хочешь увеличить вероятность оказания помощи - выложи тестовые примеры ексельного файла и проекта библиотеки.

Автор: OleGator08 16.1.2008, 08:25
Ясно... Рассчитывал на помощь, что у кого то подобный опыт уже был... А копать мой код - это ваще неблагодарная затея... Я бы не стал, к примеру... Увы и ах... Будем искать дальше... Может у кого то где то и были подобные баги...

Добавлено через 12 минут и 55 секунд
И еще замечу... Ранее при работе со всеми этими функциями в проектах, где происходило вычисление данных и передача их тупо  в ячейки Excel - все работало нормально... Т.е. отрабатывал exe-файл, написанный на D6, и в нем же происходила передача вычисляемых данных через OLE-механизм в нужные ячейки... Никаких ошибок при работе с динамическими массивами и своими типами дин. массивов...  А вот при попытке привлечь вычисление с использованием DLL - что то Excel не понравилось... Ошибка явно использования памяти... Думаю, что наверняка были у народа подобные "грабли", кто работает с передачей данных в MS Office....

Автор: MetalFan 16.1.2008, 09:06
может в dll CoInitialize/CoUnitialize вызывать...  ?

Автор: OleGator08 16.1.2008, 10:05
Забавно! Причина стала понятной! Осталось только понять как устранить баг! Итак, используя утилиты и в частности tasklist /m удалось понять, что при выходе Excel тупо не успевает выгрузить за собой rtl60.bpl, которая похоже как то "не переваривается" MS... Тупо поставив задержку на событии закрытия листа в виде MsgBox("") получили выгрузку всего "паровоза", тянущегося за моей DLL... И уже нажав на "ok" Excel мирно выгрузился smile ! Т.е. нужно где то предусмотреть желательную гарантированную выгрузку всего "паровоза", включенного в DLL, а она строится с пакетами rtl у меня... Ну временный выход то есть, тот же диалог при событии выхода... Но это не интересно... Может кому интересно и кто то посоветует что лучше сделать? Прилагаю протокол библиотек по команде tasklist /m ...
 

Автор: ivan219 16.1.2008, 12:18
А зачем ты вместе с пекетами Dll юзаешь? Выключи Build with runtime packages и может проблема исчезнет

Автор: MetalFan 16.1.2008, 12:50
Цитата(OleGator08 @  16.1.2008,  10:05 Найти цитируемый пост)
Может кому интересно и кто то посоветует что лучше сделать? 

я тебе уже посоветовал:
создай пример xls файла и пример библиотеки. соотв.чтобы из екселя вызывалась какая-нибудь функция из dll
выложи их здесь и кто-нибудь наверняка посмотрит ;)

Автор: OleGator08 21.1.2008, 08:34
Цитата(MetalFan @ 16.1.2008,  12:50)
я тебе уже посоветовал:
создай пример xls файла и пример библиотеки. соотв.чтобы из екселя вызывалась какая-нибудь функция из dll
выложи их здесь и кто-нибудь наверняка посмотрит ;)

Доброго времени суток!
Выкладываю надстройку для Excel xla файл, dll и пример использования test_dll.xls, где на последнем листе работает пара ф-ций... Ошибка повторяется при добавке нового использования ф-ций, после выхода из Excel и т.д. Dll - лучше положить в Windows или иной каталог для умолчания...  Компоновать с runtime - желательно, чтобы не тащить это все юзерам на персоналки... 

Автор: OleGator08 22.1.2008, 15:17
Цитата(ivan219 @  16.1.2008,  12:18 Найти цитируемый пост)
А зачем ты вместе с пекетами Dll юзаешь? Выключи Build with runtime packages и может проблема исчезнет 

Нет проблема не исчезает и с компоновкой без пакетов...  Более того, вставляешь использование иных функций из dll в Лист эта долбанная ошибка вылетает даже если последовательно сохранить книгу и выходить их Excel! Как корректно освобождать этот паровоз пакетов? Может можно при закрытии организовать из dLL выгрузку пакетов принудительно? Есть такие процедуры? Или есть иные методы как бороться с этим паровозом, которого MS что то не понимает?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)