-
Существует DLL, взаимодействующая с интербейзом... DLL подключается динамически из основной программы и имеет модальную форму... В случае, если в запросе DLL к IB происходит ошибка - генерируется исключение, выдается предупреждение об ошибке, DLL завершает работу по Exception... Далее, главная программа после завершения работы библиотеки доходит до фунуции FreeLibrary(hndl) - и намертво виснет... Если же исключение в библиотеке генерируется не в результате ошибки запроса, а по другой причине - FreeLibrary в главной программе отрабатывает корректно. Понятно, что скорее всего какой-то "хвост" остается от связки DLL-IB, который не дает выгрузить библиотеку из памяти. Но какой? Операционная система WinXP Sp2 Delphi 2007 Код библиотеки в очень сильно упрощенном виде выглядит так:
..............................................
var _HandleOwnerApp :THandle;
.............................................
..............................................
procedure DllMain(fdwReason:DWORD);
begin
case fdwReason of
DLL_THREAD_ATTACH: ;
DLL_THREAD_DETACH: ;
DLL_PROCESS_ATTACH: begin
....................
...................
CoInitialize(nil);
end;
DLL_PROCESS_DETACH: begin
DModule.IBDB.Close;
DModule.Free;
CoUnInitialize;
end;
end;
end;
function ShowRep(DVar:Variant):Variant; StdCall;
var ...................
....................
begin
_HandleOwnerApp := Application.Handle;
Application.Handle := DVar[0]; if not Assigned(DModule) then DModule := TDModule.Create(DModule);
DModule.IBDB.DatabaseName := DVar[2]; ...........................................................
...........................................................
with TfmListReports.Create(nil) do
begin
try
.................................
..................................
if ShowModal = mrOK then
begin
.....................
.......................
Query.Open; ........................
........................
Free;
DModule.IBDB.Close;
DModule.Free;
Result := VarArrayOf([1,null,null]);
end;
except
on E:Exception do
begin
CreateDialog('Ошибка!', E.Message , mtError, [mbYes], poOwnerFormCenter);
Result := VarArrayOf([0,null,null]);
Free;
DModule.IBDB.Close;
DModule.Free;
CoUnInitialize;
end;
end;
end;
end;
exports ShowRep;
begin
DllProc := @DllMain;
DllMain(DLL_PROCESS_ATTACH);
end.
На самом деле, буду рад любому совету, который хотя бы даст направление в поисках решения этой проблемы. Заранее спасибо.
-
except on E:Exception do begin CreateDialog('Ошибка!', E.Message , mtError, [mbYes], poOwnerFormCenter); Result := VarArrayOf([0,null,null]); Free; DModule.IBDB.Close; DModule.Free; CoUnInitialize; end; end;
DLL_PROCESS_DETACH: begin DModule.IBDB.Close; DModule.Free; CoUnInitialize; end;
-
Жуткая каша)..
Уже язык отсох спрашивать - зачем тут stdcall ?
-
Sashka, то, что выделил мне жирным - не влияет на суть проблемы.. На самом деле в exception в программе строки DModule.IBDB.Close; DModule.Free - отсутствуют. Просто в форуме не очень удобно писать код... Как они там очутились в коде поста - самому не понятно! :) Сергей М., мудрый человечище, так подскажи! Авось, язык не отсохнет.. На этом форуме я посетитель редкий и частым быть не собираюсь - поэтому следить за твоими ответами - мне нет ни силЮ ни времени: очень много работы..
-
> подскажи!
Сначала скажи, откуда и зачем оно у тебя взялось ..
> не влияет на суть проблемы
Еще как влияет)
-
> Как они там очутились в коде поста - самому не понятно
Равно как ни тебе ни нам непонятно и появление stdcall)
-
stdcall - ключевое слово. Благодаря нему, вместо боллее эффективной методики передачи параметров, используемой Delphi по умолчанию (ключевое слово register), используется методика передачи параметров, применяемая в Win32. stdcall - можно не применять, если обращение к библиотеке происходит из приложения, написанного на Delphi. Тебе это объяснить?
-
Кстати, при работе аналогичной библиотеки с MS SQL Server - подобной проблемы при ошибке запроса не возникает....
-
> stdcall - можно не применять, если обращение к библиотеке > происходит из приложения, написанного на Delphi
А зачем же тогда применяешь ? Тем более если Pascal fastcall более эффективно ?
-
И - уж сколько раз твердили миру - дельфийским формам не место в dll, для них придуманы bpl !
-
:) Спасибо, Сергей М.! А знаешь, что есть такие понятия, как "техническое задание" и "пожелания заказчика"? А так же, сложившийся исторически процесс написания проекта, которому уже несколько лет и где модульность поддерживается с помощью DLL.. А так должна быть предусмотрена возможность вызова библиотеки не только из Дельфовых приложений, но из приложения, написанных на C++ и VB? Видимо, не слышал.. Или не приходилось работать в таких организациях, между прочим - весьма серьезных.. Cразу все вешаешь на свою колокольню. Как я понял - по сути вопроса ответа ты мне дать не можешь... Но не переживай - многие не могут. В различных форумах встречаются вопросы по этой проблеме (не только Дельфийские форумы) - но с ответами там туго...
-
> На самом деле в exception в программе > строки > DModule.IBDB.Close; > DModule.Free - отсутствуют. Просто в форуме не очень удобно > писать код... Как они там очутились в коде поста - самому > не понятно! :)
)) Зачет
А Эксепшен то (не интербейзовский) в том же куске кода-то хоть генерируется тоже???
-
а как же?
-
Ладно.. Тема закрыта... Буду "рыть" сам.. Спасибо за посильную помощь...
-
> должна быть предусмотрена возможность вызова библиотеки > не только из Дельфовых приложений, но из приложения, написанных > на C++ и VB? Видимо, не слышал
Я-то слышал.
А вот ты , видимо, не слышал, что, к примеру, дельфийский тип Variant не совместим с одноименным типом в VB. А ты этот тип ничтоже сумняшеся тычешь параметром и результатом своей функции. Кр.того, нет никакой гарантии, что твой код будет работать, если тебе передадут параметром хэндл окна недельфийского приложения.
Вот тебе и "по сути")
-
А вот тебе еще грабли - ты не придаешь НИКАКОГО значения тому. в КАКОМ кодовом потоке хост-процесса будет инициализирована твоя билиотека и в каком потоке вызвана твоя ф-ция в ее составе.
-
Так что текущие грабли - это только грабельки. А граблища у тебя еще впереди)
-
> очень много работы
Что, и на изучение возможностей встр.отладчика времени не хватает ? Или желания ?)
Ведь место "виса" с его помощью выясняется самостоятельно и элементарно)
-
Удалено модератором
|