我正在写一个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;
EXE文件:
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传递给DLL,如下所示:Delphi exe:
// 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中正确实现回调部分。一些示例代码将不胜感激。虽然debuging初始化工作正常,但是回调失败了。提前谢谢。
答案 0 :(得分:4)
你的作业陈述是落后的。在DLL函数中,DLLParametersID
保存有关回调的信息,但随后用全局变量覆盖它:
DLLParametersID.CallbackFunction:= @DLLCallback;
将这些转换为 assign DLLCallback
。