我正在编写一个 Delphi DLL。在Delphi DLL中我想实现一个回调函数,这个回调函数应该回调给调用者Delphi程序。回调函数的主要目的是在DLL中会发生某些长时间的操作,但进度报告(通过进度条)和操作取消应该发生在调用方的Delphi程序中。
我想获得一些支持,如何在 DLL 中正确实现回调函数。我可以继续分配从 EXE 传递的回调函数,但我不知道如何从 DLL 本身发起调用。
这是定义部分(由 EXE 和 DLL 使用):
uses Windows;
Type
PTCallBackStruct = ^TCallBackStruct;
TCallBackStruct = packed record
Handle: THandle;
Caller: Pointer;
FileSize: LongInt;
end;
type
TFunctionPointerType = function(ZCallbackRec: PTCallBackStruct): Longbool;
stdcall;
type
PTDLLParamaters = ^TDLLParamaters;
TDLLParamaters = packed record
Handle: THandle;
Caller: Pointer;
CallbackFunction: TFunctionPointerType;
end;
var
DLLCallback: TFunctionPointerType;
可执行文件:
uses ....
type
function DLL_Callback(ZCallBackRec: PTCallBackStruct): LongBool; stdcall;
forward;
implementation
function DLL_Callback(ZCallBackRec: PTCallBackStruct): LongBool; stdcall;
begin
// progress reporting this function should be called back from
//the DLL. The Handle and Self parameter should help with identifying
// which object initiated the callback
end;
通过 PTDLLParameters 从 Delphi exe 传递给 DLL 如下:
// init callback
DLLParameters := AllocMem(SizeOf(TDLLParamaters));
with DLLParameters^ do
begin
Handle := Application.Handle;
Caller := Self;
CallbackFunction:= DLL_Callback;
end;
加载 DLL
.....
.....
调用 DLL
CompressionCreateLibrary(DLLParameters);
....
某些操作
Free DLL
....
.....
FreeMem(DLLParameters);
DLL文件:
应该从 DLL 的某些部分调用此函数,以便返回有关实际操作的 EXE:
function CallCallBackFromDLL(Size: integer): Integer;
begin
//
....
set up callbackstruct
....
// calling back
DLLCallback(CallbackStruct);
end;
我认为这部分应该没问题:
// main init call assigning the callback function to the DLL
function CompressionCreateLibrary(DLLParametersID: PTDLLParamaters): Integer;
begin
DLLParametersID.CallbackFunction:= @DLLCallback;
end;
请帮助我如何在 DLL 中正确实现回调部分。一些示例代码将不胜感激。虽然调试初始化工作正常,但进行回调失败。先感谢您。