Текущий архив: 2007.08.26;
Скачать: CL | DM;
Вниз
Выгрузка *.dll Найти похожие ветки
← →
DeadMeat © (2007-03-01 09:08) [0]Здравствуйте уважаемые жители.<br/>Вот проблема возникла. Пишу *.dll. Встала задача выполнять некоторые действия "во время" загрузки ее в АП процесса и "во время" выгрузки. Используется только в одном процессе.<br/>Если быть точным, то пишу библиотеку для подключения в MSSQL 2005. Расширенные процедуры делаю. Вот и нужно создать "кое-чаво" во время загрузки. И это "кое-чаво" уничтожить во время выгрузки.<br/>Пробовал:<br/><code><br/>DLLProc:= @DLLEntryPoint;<br/>DLLEntryPoint(DLL_PROCESS_ATTACH);<br/></code><br/>и соответственно:<br/><code><br/>procedure DLLEntryPoint(dwReason: DWORD); stdcall;<br/>begin<br/>  case dwReason of<br/>    DLL_PROCESS_ATTACH: begin<br/>                        end;<br/>    DLL_PROCESS_DETACH: begin<br/>                        end;<br/>  end;<br/>end;<br/></code><br/>Вот при таком подходе, MS SQL 2005 почему то "падает". Он просто тихо молча завершает процесс свой и все. Убрал первые две строки (DLLEntryPoint) и все работает нормально. Но мне все же надо знать когда "мы загружаемся" и когда "мы выгружаемся".<br/><br/>ЗЫ. Тестировалось на:<br/>WinXP (SP2), SQL Express 2005 (SP2)<br/>Win2k3 (SP1), SQL Enterprise 2005 (SP1)<br/>Win2k3 (Sp1), SQL Enterprise 2000 (SP4)<br/>В первых двух случаях SQL просто "умирает". Но самое интересное (на мой взгляд) это то, что "умирает" он не сразу, а через какоето время. Т.е. библиотека работает. Делает свое дело исправно. И в какойто момент - БАЦ. И нету.<br/>В последнем (SQL 2000) случае все работает как часы. И ничего не умирает.<br/><br/>ЗЫЫ. Не исключаю, что для расширенных процедур нужно чтото делать еще. Но вот что - не знаю. Пробовал даже делать абсолютно пустую *.dll - результат тотже. Т.е. я "подсовывал" 2005ому пустую (экспортировались функции, внутри которых ничего не делалось и при загрузке также не производилось никаких действий) библиотеку и когда он обращался к одной из функций, через какоето время происходило падение. Стоило убрать DLLEntryPoint и иже с ним, и все стало работать нормально.<br/>Кто сталкивался с подобным? Пишу на Turbo Delphi Exporer 2006 со всеми апдейтами и хотфиксами.
← →
Сергей М. © (2007-03-01 09:34) [1]stdcall убери - и всех делов)
← →
DeadMeat © (2007-03-01 10:59) [2]Мда.<br/>Ну что сказать. Большое спасибо Вам Сергей. Все заработало. Проблема решена.<br/>Еще раз спасибо!
← →
kernel © (2007-03-05 19:52) [3]Доброго времени суток. Чтобы новую тему не создавать, решил спросить здесь. А что вообще "дает" stdcall, в смысле для чего он?
← →
Eraser © (2007-03-05 20:19) [4]<i>> [3] kernel ©   (05.03.07 19:52)<br/></i><br/>stdcall это соглашение о передачи параметров функций. Гугл подскажет поподробнее.
← →
Belorus © (2007-03-06 00:00) [5]Типа порядок следования параметров обратный.. Или наоборот прямой :) Забыл.
← →
Eraser © (2007-03-06 00:08) [6]<i>> [5] Belorus ©   (06.03.07 00:00)<br/></i><br/>обратный, т.к. через стек.
← →
Сергей М. © (2007-03-06 08:41) [7]<i><br/>> kernel ©   (05.03.07 19:52) [3]<br/></i><br/><br/>Соглашение stdcall предписывает компилятору генерировать код вызова/завершения подпрограммы по следующим стандартным правилам:<br/><br/>1. Перед вызовом подпрограммы параметры (если они имеются) помещаются в стек справа налево в порядке их следования в строке текста вызова.<br/><br/>2. После возврата из подпрограммы помещенные в стек параметры (если они имеются) не удаляются - за это ответственна сама подпрограмма.
← →
kernel © (2007-03-06 09:52) [8]спасибо, все понял :)
Страницы: 1 вся ветка
Текущий архив: 2007.08.26;
Скачать: CL | DM;
Память: 0.8 MB
Время: 0.034 c