我正在编写一个Delphi DLL。在这个DLL中,我想要实现一个回调函数,该回调函数应该回调到调用者的Delphi程序。回调函数的主要目的是,在DLL中会发生某些长时间操作,但进度报告(通过进度条)和操作取消应该在调用者的Delphi程序中发生。
我希望得到一些支持,了解如何在DLL中正确实现回调函数。我可以进行下一步分配从EXE传递过来的回调函数,但我不知道如何从DLL本身初始化调用。
以下是定义部分(由EXE和DLL使用):
调用DLL
请帮忙解决DLL中回调函数的正确实现方式,希望能提供一些示例代码。在初始化时进行调试时一切正常,但是回调失败了。谢谢您的帮助。
我希望得到一些支持,了解如何在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;
通过PTDLL参数从Delphi exe传递给DLL:
// init callback
DLLParameters := AllocMem(SizeOf(TDLLParamaters));
with DLLParameters^ do
begin
Handle := Application.Handle;
Caller := Self;
CallbackFunction:= DLL_Callback;
end;
加载动态链接库
.....
.....
调用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中回调函数的正确实现方式,希望能提供一些示例代码。在初始化时进行调试时一切正常,但是回调失败了。谢谢您的帮助。