5

我正在编写一个 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 中正确实现回调部分。一些示例代码将不胜感激。虽然调试初始化工作正常,但进行回调失败。先感谢您。

4

1 回答 1

4

你的赋值语句是落后的。在 DLL 函数中,DLLParametersID保存有关回调的信息,然后用全局变量覆盖它:

DLLParametersID.CallbackFunction:= @DLLCallback;

交换那些分配 DLLCallback

于 2013-08-22T12:36:22.207 回答