DllProc не определен в FPC ?

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

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

Ответить
Sphinx
новенький
Сообщения: 33
Зарегистрирован: 27.09.2005 21:52:09

Сообщение Sphinx »

В Delphi, чтобы получить обработку DllMain на Сишный манер, достаточно было описать процедуру DllMain(dwReason: DWORD); stdcall; а потом написать:

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

begin
  DllProc := @DllMain;
  DllMain(DLL_PROCESS_ATTACH);
end.


Так вот, если этот код попробовать скомпилировать под FPC (пробовал под версией 2.0.0) то на строку DllProc := @DllMain; компилятор ругается, мол не определена переменная DllProc.

Режим совместимости выставлен как {$MODE DELPHI}.

Получается в FPC такой "фокус" не проходит, или у меня радиус кривизны рук зашкалил ? :unsure:
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

глянь сюда, может поможет разобраться?
<a href='http://www.freepascal.ru/article//freepascal/20050520001454/#dynlibs-use' target='_blank'>http://www.freepascal.ru/article//freepasc...54/#dynlibs-use</a>
Sphinx
новенький
Сообщения: 33
Зарегистрирован: 27.09.2005 21:52:09

Сообщение Sphinx »

serg_iv
Я это читал так-то...
Может меня поняли неправильно...

Вобщем вот примерный код (набросаю прямо тут - могу очепятаться где-нибудь, не пинайте сильно)

Есть INC файл Dll.inc, где кроме всего прочего есть такие строки:

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

{IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}


и есть файл проекта

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

library Dll;

{$INCLUDE Dll.inc}

uses
  Windows,
  MyFunc in 'MyFunc.pas',  // тут определены CreateData и DeleteData
  <others pas files>;

procedure DllMain(dwReason: DWORD); stdcall;
begin
  case dwReason of
    DLL_PROCESS_ATTACH: CreateData;
    DLL_PROCESS_DETACH: DeleteData;
  end;
end;

exports
  <Some Function From other pas files>;

begin
  DllProc := @DllMain;  // вот тут компилятор Free Pascal`я ругается, а в Delphi все ОК
  DllMain(DLL_PROCESS_ATTACH);
end.
Janus
постоялец
Сообщения: 134
Зарегистрирован: 07.11.2005 16:06:49

Сообщение Janus »

Попробуй так:

@DllProc := @DllMain;
Sphinx
новенький
Сообщения: 33
Зарегистрирован: 27.09.2005 21:52:09

Сообщение Sphinx »

Janus
неа....тот же шарик, вид с боку

<!--QuoteBegin-"FPC"+--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Цитата ("FPC")</td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->Error: Identifier not found "DllProc"[/quote]
virt
новенький
Сообщения: 35
Зарегистрирован: 01.12.2005 11:31:41

Сообщение virt »

В документации не нашел ,значит такре просто не поддерживается. Или по другому называется?
PVOzerski
постоялец
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб
Контактная информация:

Сообщение PVOzerski »

Кажется, я разобрался...

Сейчас в FPC реализован другой механизм, нежели в Delphi. В модуле system для некоторых платформ (включая win32) определено вот такое:

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;

На это можно подключать свои обработчики.

Вообще-то я сейчас послал им патчик, который должен добавить DllProc для Win32, Win64, WinCE и Netware (libc). Хорош ли он - судить не берусь.
PVOzerski
постоялец
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб
Контактная информация:

Сообщение PVOzerski »

Кстати, а почему в примерчике DllMain объявлен как stdcall? Из текста дельфийского системного модуля это никак не следует, скорее - наоборот.
Sphinx
новенький
Сообщения: 33
Зарегистрирован: 27.09.2005 21:52:09

Сообщение Sphinx »

PVOzerski
Саму идею такого подключения "подсмотрел" в примере по реализации хуков на "Мастерах Делфи" <a href='http://delphimaster.ru/articles/hooks/index.html' target='_blank'>вот тут</a>
И там в примере обозначено stdcall, собственно с тех пор и пишу так, если считаю целесообразным вызывать такую процедуру.

Спасибо за ответ !!!
Ответить