Что я сделал не так, в этой чертовой длл-ке?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
LD-73
незнакомец
Сообщения: 6
Зарегистрирован: 09.11.2007 16:25:44

Что я сделал не так, в этой чертовой длл-ке?

Сообщение LD-73 »

Всем доброго!
Все наверное видели этот участок кода, для сборки длл-лок.

Код: Выделить всё

type
  TDLL_Process_Entry_Hook = function (dllparam : longint) : longbool;
  TDLL_Entry_Hook = procedure (dllparam : longint);

const
  Dll_Process_Attach_Hook : TDLL_Process_Entry_Hook = nil;
  Dll_Process_Detach_Hook : TDLL_Entry_Hook = nil;
  Dll_Thread_Attach_Hook : TDLL_Entry_Hook = nil;
  Dll_Thread_Detach_Hook : TDLL_Entry_Hook = nil;


все бы ничего, да вот никак не могу получить событие Dll_Process_Detach_Hook, в чем грабли???
код:

Код: Выделить всё

begin
     Dll_Process_Attach_Hook := @DLLEntryPoint;
     DLLEntryPoint(DLL_PROCESS_ATTACH);
     Dll_Thread_Attach_Hook := @DLLTHREADATTACH;
     Dll_Thread_Detach_Hook := @DLLTHREADDETACH;
     Dll_Process_Detach_Hook := @DLLPROCESSDETACH;
end.


Dll_Thread_Attach_Hook, Dll_Thread_Detach_Hook отрабатывают, а этот Dll_Process_Detach_Hook молчит :(

Заранее спасибо!
LD-73
незнакомец
Сообщения: 6
Зарегистрирован: 09.11.2007 16:25:44

Сообщение LD-73 »

Неужели никто с подобным не сталкивался?
halyavin
новенький
Сообщения: 25
Зарегистрирован: 23.10.2007 16:35:55

Сообщение halyavin »

А как ты проверяешь, что он молчит? В процессе завершения приложения ты к WinAPI, вообще говоря, уже обращаться не можешь.
LD-73
незнакомец
Сообщения: 6
Зарегистрирован: 09.11.2007 16:25:44

Сообщение LD-73 »

halyavin писал(а):А как ты проверяешь, что он молчит? В процессе завершения приложения ты к WinAPI, вообще говоря, уже обращаться не можешь.

Да все просто, если ты выполняешь freeliblary(HandleLib); то в ответ должно сработать DLL_PROCESS_DETACH, так работает любая длл-ка писанная на Дельфи или Си.
В данном случае, этого не происходит, причину всего мне сложно уяснить.
Atlant
новенький
Сообщения: 17
Зарегистрирован: 25.07.2006 08:43:29

Сообщение Atlant »

Код: Выделить всё

const
  Dll_Process_Attach_Hook : TDLL_Process_Entry_Hook = nil;
  Dll_Process_Detach_Hook : TDLL_Entry_Hook = nil;

Мне немного странно видеть в данном коде, может все таки
LD-73
незнакомец
Сообщения: 6
Зарегистрирован: 09.11.2007 16:25:44

Сообщение LD-73 »

Atlant писал(а):

Код: Выделить всё

const
  Dll_Process_Attach_Hook : TDLL_Process_Entry_Hook = nil;
  Dll_Process_Detach_Hook : TDLL_Entry_Hook = nil;

Мне немного странно видеть в данном коде, может все таки

Что именно странного?
этот участок кода вырезан из system.pp файла, т.е. я его придумал.
halyavin
новенький
Сообщения: 25
Зарегистрирован: 23.10.2007 16:35:55

Сообщение halyavin »

А минимальный код (прога+dll'ка) демонстрирующий проблему можешь запостить? Думаю низкоуровневый дебаггер быстро определит где проблема.
LD-73
незнакомец
Сообщения: 6
Зарегистрирован: 09.11.2007 16:25:44

Сообщение LD-73 »

Вот код, я думаю и без него я все сказал что можно было сказать по проблеме.

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
   LibHandle: THandle;
   fInitializeSession: tInitializeSession;
   CloseSession: TCloseSession;
   Error: Pchar;
begin
     OpenDialog1.Execute;
     LibHandle := LoadLibrary(Pchar(OpenDialog1.FileName));
     if(LibHandle <> 0)then
     begin
          @fInitializeSession := GetProcAddress(LibHandle, 'InitializeSession');
          Error := AllocMem(256);
          fInitializeSession(Error);
          @CloseSession := GetProcAddress(LibHandle, 'CloseSession');
          CloseSession(0);
          FreeLibrary(LibHandle);
          FreeMemory(Error);
     end;
end;


FreeLibrary(LibHandle); после этого должно выполниться DLL_PROCESS_DETACH, но в ответ тишина
halyavin
новенький
Сообщения: 25
Зарегистрирован: 23.10.2007 16:35:55

Сообщение halyavin »

test.pp:

Код: Выделить всё

{$MODE ObjFPC}
uses windows;
var
  h:THandle;
begin
  h:=LoadLibrary('testDll.dll');
  writeln(h);
  FreeLibrary(h);
end.

testDll.pp:

Код: Выделить всё

library testDll;
{$MODE ObjFPC}
procedure ProcessDetach(x:integer);
begin
  while true do;
end;
begin
  Dll_Process_Detach_Hook:=@ProcessDetach;
end.

Компилирую fpc 2.1.4. При запуске test.exe зависает. Если закомментировать while true do; - не зависает. Так что давайте полный текст вызывающей программы и dll'ки (без форм желательно) + .exe файл. Я подозреваю, что хук вызывается, просто делает не то, что вы задумали или вы по какой-либо еще причине не видите результатов его работы.
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

halyavin
вы эксперт по длл ? посмотрите соседний вопрос
AMD
постоялец
Сообщения: 189
Зарегистрирован: 23.01.2008 21:25:25
Откуда: Кишинев

Сообщение AMD »

halyavin писал(а):test.pp:

Код: Выделить всё

{$MODE ObjFPC}
uses windows;
var
  h:THandle;
begin
  h:=LoadLibrary('testDll.dll');
  writeln(h);
  FreeLibrary(h);
end.

testDll.pp:

Код: Выделить всё

library testDll;
{$MODE ObjFPC}
procedure ProcessDetach(x:integer);
begin
  while true do;
end;
begin
  Dll_Process_Detach_Hook:=@ProcessDetach;
end.

Компилирую fpc 2.1.4. При запуске test.exe зависает. Если закомментировать while true do; - не зависает. Так что давайте полный текст вызывающей программы и dll'ки (без форм желательно) + .exe файл. Я подозреваю, что хук вызывается, просто делает не то, что вы задумали или вы по какой-либо еще причине не видите результатов его работы.

{Извените за ламерский вопрос но я недавно начал изучать программирование}
Ладно библиотеку загрузили а как работать с функциями в ней - можете наглядный пример привести

Можно как нибудь узнать какие там функции, какие параметры у них?
Ответить