Delphi DLL和Delphi EXE之间的回调功能

时间:2013-08-22 11:18:35

标签: 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;

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初始化工作正常,但是回调失败了。提前谢谢。

1 个答案:

答案 0 :(得分:4)

你的作业陈述是落后的。在DLL函数中,DLLParametersID保存有关回调的信息,但随后用全局变量覆盖它:

DLLParametersID.CallbackFunction:= @DLLCallback;

将这些转换为 assign DLLCallback