Форум: "Основная";
Текущий архив: 2009.09.20;
Скачать: [xml.tar.bz2];
ВнизInterBase и FreeLibrary Найти похожие ветки
← →
asafr (2008-07-04 15:42) [0]Существует 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]; //HandleCallApp;
if not Assigned(DModule) then DModule := TDModule.Create(DModule);
DModule.IBDB.DatabaseName := DVar[2]; //ConnectionString IBDataBase
...........................................................
...........................................................
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.
На самом деле, буду рад любому совету, который хотя бы даст направление в поисках решения этой проблемы.
Заранее спасибо.
← →
Sashka (2008-07-04 15:54) [1]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;
← →
Сергей М. © (2008-07-04 15:59) [2]Жуткая каша)..
Уже язык отсох спрашивать - зачем тут stdcall ?
← →
asafr (2008-07-04 16:08) [3]Sashka, то, что выделил мне жирным - не влияет на суть проблемы..
На самом деле в exception в программе
строки
DModule.IBDB.Close;
DModule.Free - отсутствуют. Просто в форуме не очень удобно писать код... Как они там очутились в коде поста - самому не понятно! :)
Сергей М., мудрый человечище, так подскажи! Авось, язык не отсохнет..
На этом форуме я посетитель редкий и частым быть не собираюсь - поэтому следить за твоими ответами - мне нет ни силЮ ни времени: очень много работы..
← →
Сергей М. © (2008-07-04 16:13) [4]
> подскажи!
Сначала скажи, откуда и зачем оно у тебя взялось ..
> не влияет на суть проблемы
Еще как влияет)
← →
Сергей М. © (2008-07-04 16:14) [5]
> Как они там очутились в коде поста - самому не понятно
Равно как ни тебе ни нам непонятно и появление stdcall)
← →
asafr (2008-07-04 16:21) [6]stdcall - ключевое слово. Благодаря нему, вместо боллее эффективной методики передачи параметров, используемой Delphi по умолчанию (ключевое слово register), используется методика передачи параметров, применяемая в Win32. stdcall - можно не применять, если обращение к библиотеке происходит из приложения, написанного на Delphi. Тебе это объяснить?
← →
asafr (2008-07-04 16:22) [7]Кстати, при работе аналогичной библиотеки с MS SQL Server - подобной проблемы при ошибке запроса не возникает....
← →
Сергей М. © (2008-07-04 16:31) [8]
> stdcall - можно не применять, если обращение к библиотеке
> происходит из приложения, написанного на Delphi
А зачем же тогда применяешь ? Тем более если Pascal fastcall более эффективно ?
← →
Сергей М. © (2008-07-04 16:33) [9]И - уж сколько раз твердили миру - дельфийским формам не место в dll, для них придуманы bpl !
← →
asafr (2008-07-04 16:45) [10]:)
Спасибо, Сергей М.! А знаешь, что есть такие понятия, как "техническое задание" и "пожелания заказчика"? А так же, сложившийся исторически процесс написания проекта, которому уже несколько лет и где модульность поддерживается с помощью DLL..
А так должна быть предусмотрена возможность вызова библиотеки не только из Дельфовых приложений, но из приложения, написанных на C++ и VB? Видимо, не слышал.. Или не приходилось работать в таких организациях, между прочим - весьма серьезных.. Cразу все вешаешь на свою колокольню.
Как я понял - по сути вопроса ответа ты мне дать не можешь...
Но не переживай - многие не могут. В различных форумах встречаются вопросы по этой проблеме (не только Дельфийские форумы) - но с ответами там туго...
← →
Sashka (2008-07-04 16:50) [11]
> На самом деле в exception в программе
> строки
> DModule.IBDB.Close;
> DModule.Free - отсутствуют. Просто в форуме не очень удобно
> писать код... Как они там очутились в коде поста - самому
> не понятно! :)
)) Зачет
А Эксепшен то (не интербейзовский) в том же куске кода-то хоть генерируется тоже???
← →
asafr (2008-07-04 16:53) [12]а как же?
← →
asafr (2008-07-04 16:54) [13]Ладно.. Тема закрыта... Буду "рыть" сам.. Спасибо за посильную помощь...
← →
Сергей М. © (2008-07-04 16:55) [14]
> должна быть предусмотрена возможность вызова библиотеки
> не только из Дельфовых приложений, но из приложения, написанных
> на C++ и VB? Видимо, не слышал
Я-то слышал.
А вот ты , видимо, не слышал, что, к примеру, дельфийский тип Variant не совместим с одноименным типом в VB. А ты этот тип ничтоже сумняшеся тычешь параметром и результатом своей функции.
Кр.того, нет никакой гарантии, что твой код будет работать, если тебе передадут параметром хэндл окна недельфийского приложения.
Вот тебе и "по сути")
← →
Сергей М. © (2008-07-04 16:57) [15]А вот тебе еще грабли - ты не придаешь НИКАКОГО значения тому. в КАКОМ кодовом потоке хост-процесса будет инициализирована твоя билиотека и в каком потоке вызвана твоя ф-ция в ее составе.
← →
Сергей М. © (2008-07-04 16:58) [16]Так что текущие грабли - это только грабельки.
А граблища у тебя еще впереди)
← →
Сергей М. © (2008-07-04 17:01) [17]
> очень много работы
Что, и на изучение возможностей встр.отладчика времени не хватает ? Или желания ?)
Ведь место "виса" с его помощью выясняется самостоятельно и элементарно)
← →
asafr (2008-07-05 01:31) [18]Удалено модератором
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2009.09.20;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.006 c