Dll_Process_Attach_Hook

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

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

Ответить
Spirit111
незнакомец
Сообщения: 3
Зарегистрирован: 23.07.2006 16:53:55

Dll_Process_Attach_Hook

Сообщение Spirit111 »

Хочу отловить момент, когда dll цепляется к процессу.

Пишу самую элементарную DLL:

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

library p1;

{$mode objfpc}{$H+}

uses
 Classes
 { add your units here };

procedure Insert(i: cardinal); cdecl;
var F:TextFile;
begin
 AssignFile(F, 'c:\insert.txt');
 Rewrite(F);
 Writeln(F, 'done');
 Closefile(F);
end;

procedure PH2(dllparam : longint);
var F:TextFile;
begin
 AssignFile(F, 'c:\Dll_Thread_Attach_Hook.txt');
 Rewrite(F);
 Writeln(F, 'done');
 Closefile(F);
end;

function PH(dllparam : longint) : longbool;
var F:TextFile;
begin
 AssignFile(F, 'c:\Dll_Process_Attach_Hook.txt');
 Rewrite(F);
 Writeln(F, 'done');
 Closefile(F);
 Result:=true;
end;

exports Insert;

begin
 Dll_Process_Attach_Hook:=@PH;
 Dll_Thread_Attach_Hook:=@PH2;
end.


Далее вызываю функцию Insert после динамической линковки в тестовой проге. Без проблем создается файл insert.txt, что говорит о том, что функция Insert в DLL отработала. А вот файлы Dll_Process_Attach_Hook.txt и Dll_Thread_Attach_Hook.txt не создаются, что говорит о том, что соответствующие события мне отловить не удалось.

В чем моя ошибка? Как мне все-таки поймать момент прилинковки мой DLL к процессу?

Использую FPC 2.0.2. Компилю DLL вообще без опций:
fpc.exe моя_dll.lpr

Windows HP Home.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Есть нехорошее ощущение, что код библиотеки, устанавливающий обработчики dll_thread_attach и dll_process_attach, выполняется уже после самих этих обработчиков... Можно попробовать в тестовой программе создать дополнительный поток; при этом по идее обработчик dll_thread_attach должен вызваться еще раз.
Spirit111
незнакомец
Сообщения: 3
Зарегистрирован: 23.07.2006 16:53:55

Сообщение Spirit111 »

Sergei I. Gorelkin писал(а):Есть нехорошее ощущение, что код библиотеки, устанавливающий обработчики dll_thread_attach и dll_process_attach, выполняется уже после самих этих обработчиков...


А как быть?
Spirit111
незнакомец
Сообщения: 3
Зарегистрирован: 23.07.2006 16:53:55

Сообщение Spirit111 »

Вот дурак я невнимательный был. Сделал по аналогии с дельфийским:

library p1;

{$mode objfpc}

uses
Classes
{ add your units here };

procedure Insert(i: cardinal); cdecl;
begin
Writeln('DLL: Insert');
end;

procedure Dll_Process_Detach_Hook_Func(dllparam : longint);
begin
Writeln('DLL: Dll_Process_Detach_Hook');
end;


procedure Dll_Thread_Attach_Hook_Func(dllparam : longint);
begin
Writeln('DLL: Dll_Thread_Attach_Hook');
end;

function Dll_Process_Attach_Hook_Func(dllparam : longint) : longbool;
begin
Writeln('DLL: Dll_Process_Attach_Hook');
Result:=true;
end;

Const
{ DllEntryPoint }
DLL_PROCESS_ATTACH = 1;
DLL_THREAD_ATTACH = 2;
DLL_PROCESS_DETACH = 0;
DLL_THREAD_DETACH = 3;


exports Insert;

begin
Dll_Process_Attach_Hook:=@Dll_Process_Attach_Hook_Func;
Dll_Process_Attach_Hook_Func(DLL_PROCESS_ATTACH);

Dll_Thread_Attach_Hook:=@Dll_Thread_Attach_Hook_Func;
Dll_Process_Detach_Hook:=@Dll_Process_Detach_Hook_Func;
end.


Жирным - та строчка, которую надо было добавить.
LD-73
незнакомец
Сообщения: 6
Зарегистрирован: 09.11.2007 16:25:44

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

Spirit111 писал(а):Вот дурак я невнимательный был. Сделал по
begin
Dll_Process_Attach_Hook:=@Dll_Process_Attach_Hook_Func;
Dll_Process_Attach_Hook_Func(DLL_PROCESS_ATTACH);

Dll_Thread_Attach_Hook:=@Dll_Thread_Attach_Hook_Func;
Dll_Process_Detach_Hook:=@Dll_Process_Detach_Hook_Func;
end.


Жирным - та строчка, которую надо было добавить.

Привет, а у тебя точно работал вызов Dll_Process_Detach_Hook_Func?
Ответить