Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.26;
Скачать: CL | DM;

Вниз

Выгрузка *.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 вся ветка

Текущий архив: 2007.08.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
6-1166561840
m00ngl0w
2006-12-19 23:57
2007.08.26
WhoIs


2-1186383821
Kolan
2007-08-06 11:03
2007.08.26
SHFileOperation иногда ругается «Не могу скопировть»


15-1185443684
Cerberus
2007-07-26 13:54
2007.08.26
Symbian


2-1186348283
tigraman
2007-08-06 01:11
2007.08.26
Подскажите компонент типа DBGrid


10-1136459207
Gear
2006-01-05 14:06
2007.08.26
OleVariabt и safearray of BSTRs