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