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

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

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

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

Сообщение LD-73 » 09.11.2007 17:28:24

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

Код: Выделить всё
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 17:25:44

Сообщение LD-73 » 10.11.2007 17:31:48

Неужели никто с подобным не сталкивался?
LD-73
незнакомец
 
Сообщения: 6
Зарегистрирован: 09.11.2007 17:25:44

Сообщение halyavin » 11.11.2007 12:28:34

А как ты проверяешь, что он молчит? В процессе завершения приложения ты к WinAPI, вообще говоря, уже обращаться не можешь.
halyavin
новенький
 
Сообщения: 25
Зарегистрирован: 23.10.2007 16:35:55

Сообщение LD-73 » 12.11.2007 10:17:38

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

Да все просто, если ты выполняешь freeliblary(HandleLib); то в ответ должно сработать DLL_PROCESS_DETACH, так работает любая длл-ка писанная на Дельфи или Си.
В данном случае, этого не происходит, причину всего мне сложно уяснить.
LD-73
незнакомец
 
Сообщения: 6
Зарегистрирован: 09.11.2007 17:25:44

Сообщение Atlant » 12.11.2007 10:29:30

Код: Выделить всё
const
  Dll_Process_Attach_Hook : TDLL_Process_Entry_Hook = nil;
  Dll_Process_Detach_Hook : TDLL_Entry_Hook = nil;

Мне немного странно видеть
Код: Выделить всё
const
в данном коде, может все таки
Код: Выделить всё
var
Atlant
новенький
 
Сообщения: 17
Зарегистрирован: 25.07.2006 08:43:29

Сообщение LD-73 » 12.11.2007 10:35:37

Atlant писал(а):
Код: Выделить всё
const
  Dll_Process_Attach_Hook : TDLL_Process_Entry_Hook = nil;
  Dll_Process_Detach_Hook : TDLL_Entry_Hook = nil;

Мне немного странно видеть
Код: Выделить всё
const
в данном коде, может все таки
Код: Выделить всё
var

Что именно странного?
этот участок кода вырезан из system.pp файла, т.е. я его придумал.
LD-73
незнакомец
 
Сообщения: 6
Зарегистрирован: 09.11.2007 17:25:44

Сообщение halyavin » 12.11.2007 11:18:17

А минимальный код (прога+dll'ка) демонстрирующий проблему можешь запостить? Думаю низкоуровневый дебаггер быстро определит где проблема.
halyavin
новенький
 
Сообщения: 25
Зарегистрирован: 23.10.2007 16:35:55

Сообщение LD-73 » 12.11.2007 11:31:46

Вот код, я думаю и без него я все сказал что можно было сказать по проблеме.
Код: Выделить всё
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, но в ответ тишина
LD-73
незнакомец
 
Сообщения: 6
Зарегистрирован: 09.11.2007 17:25:44

Сообщение halyavin » 12.11.2007 19:10:34

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 файл. Я подозреваю, что хук вызывается, просто делает не то, что вы задумали или вы по какой-либо еще причине не видите результатов его работы.
halyavin
новенький
 
Сообщения: 25
Зарегистрирован: 23.10.2007 16:35:55

Сообщение Attid » 12.11.2007 22:18:36

halyavin
вы эксперт по длл ? посмотрите соседний вопрос
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение AMD » 12.03.2008 15:05:34

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 файл. Я подозреваю, что хук вызывается, просто делает не то, что вы задумали или вы по какой-либо еще причине не видите результатов его работы.

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

Можно как нибудь узнать какие там функции, какие параметры у них?
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

Рейтинг@Mail.ru