Dll_Process_Attach_Hook

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

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

Dll_Process_Attach_Hook

Сообщение Spirit111 » 23.07.2006 16:56:31

Хочу отловить момент, когда 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.
Spirit111
незнакомец
 
Сообщения: 3
Зарегистрирован: 23.07.2006 16:53:55

Сообщение Sergei I. Gorelkin » 24.07.2006 08:46:42

Есть нехорошее ощущение, что код библиотеки, устанавливающий обработчики dll_thread_attach и dll_process_attach, выполняется уже после самих этих обработчиков... Можно попробовать в тестовой программе создать дополнительный поток; при этом по идее обработчик dll_thread_attach должен вызваться еще раз.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Spirit111 » 24.07.2006 14:02:41

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


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

Сообщение Spirit111 » 13.08.2006 01:54:36

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

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.


Жирным - та строчка, которую надо было добавить.
Spirit111
незнакомец
 
Сообщения: 3
Зарегистрирован: 23.07.2006 16:53:55

Сообщение LD-73 » 09.11.2007 17:35:48

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?
LD-73
незнакомец
 
Сообщения: 6
Зарегистрирован: 09.11.2007 17:25:44


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

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

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

Рейтинг@Mail.ru