加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 04:13:50 所属栏目:大数据 来源:网络整理
导读:我正在写一个Delphi DLL.在Delphi DLL中我想实现一个回调函数,这个回调函数应该调用回调用Delphi程序.回调函数的主要目的是在DLL中发生某些长操作,但是在调用者Delphi程序中应该进行进度报告(通过进度条)和操作取消. 我想得到一些支持如何正确实现DLL中的回
我正在写一个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从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中正确实现回调部分.一些示例代码将不胜感激.虽然debuging初始化工作正常,但是回调失败了.先感谢您.

解决方法

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

交换那些以分配DLLCallback.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读