используя функцию обратного вызова delphi в C dll - PullRequest
1 голос
/ 19 октября 2011

Я использую C dll в программе Delphi XE2 без проблем.Одна из функций DLL принимает функцию в качестве аргумента.

Вот прототип функции:

var
 LMX_MySetOption: function(LmxHandle: LMX_HANDLE;
                             eOption: _LMX_SETTINGS;
                            callback: TCallBackProcedure): LMX_STATUS cdecl 
                                                {$IFDEF WIN32} stdcall {$ENDIF};

Первоначальный прототип функции C был:

LMX_STATUS LMX_SetOption(LMX_HANDLE LmxHandle, LMX_SETTINGS eOption, 
                                               const void *pSetting);

TCallBackProcedure определяется следующим образом:

type
 TCallBackProcedure = procedure(bla : Pointer) stdcall;

Я вызываю функцию следующим образом:

LMX_MySetOption(LmxHandle, LMX_OPT_HEARTBEAT_EXIT_FUNCTION, UserExitRoutine);

UserExitRoutine определяется следующим образом:

procedure UserExitRoutine(bla : Pointer) stdcall;
begin
...
end;

Не работает (нарушение прав доступа) Я не могу изменить Cll.

Большое спасибо за любую идею!

1 Ответ

0 голосов
/ 19 октября 2011

Если это процедура C, не используйте stdcall, используйте cdecl.

И вы можете просто объявить это

 function LMX_MySetOption(LmxHandle: LMX_HANDLE;
                             eOption: _LMX_SETTINGS;
                            callback: Pointer): LMX_STATUS;cdecl;external 'yourmodule.dll'; 

procedure callback(bla:Pointer);cdecl;
begin
   //Some code
end;

LMX_MySetOption(LmxHandle, LMX_OPT_HEARTBEAT_EXIT_FUNCTION, @callback);

Это должно работать ... если это не так, возможно, вы не знаете точный номер параметров, которые имеет функция ...

...