fin*_*jom 5 delphi dll callback
我正在写一个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;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
通过PTDLLParameters从Delphi exe传递给DLL如下:
// init callback
DLLParameters := AllocMem(SizeOf(TDLLParamaters));
with DLLParameters^ do
begin
Handle := Application.Handle;
Caller := Self;
CallbackFunction:= DLL_Callback;
end;
Run Code Online (Sandbox Code Playgroud)
加载DLL
.....
.....
Run Code Online (Sandbox Code Playgroud)
调用DLL
CompressionCreateLibrary(DLLParameters);
....
Run Code Online (Sandbox Code Playgroud)
某些操作
Free DLL
....
.....
FreeMem(DLLParameters);
Run Code Online (Sandbox Code Playgroud)
DLL文件:
应该从DLL的某个部分调用此函数,使进度回到EXE关于实际操作:
function CallCallBackFromDLL(Size: integer): Integer;
begin
//
....
set up callbackstruct
....
// calling back
DLLCallback(CallbackStruct);
end;
Run Code Online (Sandbox Code Playgroud)
我认为这部分应该没问题:
// main init call assigning the callback function to the DLL
function CompressionCreateLibrary(DLLParametersID: PTDLLParamaters): Integer;
begin
DLLParametersID.CallbackFunction:= @DLLCallback;
end;
Run Code Online (Sandbox Code Playgroud)
请帮我解释如何在DLL中正确实现回调部分.一些示例代码将不胜感激.虽然debuging初始化工作正常,但是回调失败了.先感谢您.
你的赋值语句是落后的。在 DLL 函数中,DLLParametersID保存有关回调的信息,但随后您可以使用全局变量覆盖它:
DLLParametersID.CallbackFunction:= @DLLCallback;
Run Code Online (Sandbox Code Playgroud)
交换那些来分配 DLLCallback。