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

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初始化工作正常,但是回调失败了.先感谢您.

Rob*_*edy 4

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

DLLParametersID.CallbackFunction:= @DLLCallback;
Run Code Online (Sandbox Code Playgroud)

交换那些来分配 DLLCallback