【问题标题】:To transfer in dll a name of procedure from the basic program and to execute it there将基本程序中的过程名称转移到 dll 中并在那里执行
【发布时间】:2011-06-09 18:51:19
【问题描述】:

有一个程序和该程序使用的dll(两者都是在Delphi上编写的,代码都可以访问)。 在程序中有一个过程 X,它根据来自 dll 的过程 Y 的询问推导出一些统计信息(关于计时器)。 程序 Y 在 dll 中发生某些事件时变得更加活跃,这些事件可能在不同的时间间隔内发生。

问题:是否可以在dll中调用一个名为程序X的程序,并在程序Y中执行它,以便立即了解正在发生的事件,而不是在计时器上询问它。 再一次(或作为变体):如何在程序中定义,在 dll 中有什么事件并执行过程 X 的代码? 如果可能的话,一个代码示例。

【问题讨论】:

    标签: delphi dll


    【解决方案1】:

    如果我正确理解了您的问题,那么您的 EXE 中有一些代码,而 DLL 中有一些代码。每隔一段时间,就会触发一个计时器,这会导致某些东西轮询其他东西(不清楚谁在轮询什么)以查看一侧是否有任何工作可用,而另一侧的代码可以处理这些工作。而且您希望有一种方法让一方在有工作时立即通知另一方,而不必等待计时器。

    有一种非常成熟的方法可以做到这一点。在 Delphi 中设置它的标准习惯用法是使用事件和事件处理程序。基本思路如下:

    我们将创建数据的一方称为发布者,将处理工作的一方称为消费者。给 Publisher 对象一个TNotifyEvent 类型的变量。这在Classes 单元中声明为

    TNotifyEvent = procedure(Sender: TObject) of object;
    

    如果这看起来很熟悉,那是因为很大一部分 VCL 事件处理程序(例如 TButton.OnClick)属于 TNotifyEvent 类型。如果你想在事件中传递一些更有用的数据,你可以声明你自己的事件类型。例如:

    TDataReadyEvent = procedure(data: TStatisticalData) of object;
    

    将您的事件处理程序类型的变量放在发布者 (FOnDataReady: TDataReadyEvent;) 上并创建一个公开它的属性。然后添加一些代码来触发事件。在 Producer 中的某处,您有生成要分析的新数据的代码。完成后,添加如下内容:

    if assigned(FOnDataReady) then
      FOnDataReady(NewData);
    

    然后,在 Consumer 上创建一个签名与事件处理程序类型匹配的方法。它应该能够处理数据。要将它们链接在一起,请在消费者的初始化代码中执行以下操作:

    Producer.OnDataReady := self.HandleDataReady;
    

    你有它!真的就是这么简单。现在,只要 Producer 有新数据可用,就会自动调用您的 Consumer,而无需使用计时器并不断轮询 Producer 询问它是否有任何东西。

    【讨论】:

    • 我所做的与“TNotifyEvent”大致相同。我感到困惑,编译正常,但在工作中给出错误“堆栈溢出”:) 'code' 在程序中:输入 tmyproc=procedure ; .. var myproc:tmyproc; .. 程序 XX;开始显示消息(“测试”);结尾;在连接 dll: myproc: = xx; YY(myproc); --- 在 dll 中:输入 tmyproc1=procedure; .. var myproc1:tmyproc1; .. 执行 YY (tmp:tmyproc1); //在开始时工作,在连接 dll 开始 myproc1:=tmp;结尾; ..程序ZZ; //在事件开始时工作.. Myproc1; .. 结尾; '代码'
    • @Gu.:嗯,堆栈溢出通常意味着无限递归。您可以使用调试器的堆栈跟踪来找出这里发生了什么。
    • 添加后错误消失:if @Myproc1 nil then Myproc1;
    【解决方案2】:
    1. 在主模块和 DLL 中声明一个过程类型:

      type
        TMyCallbackProc = procedure(parameters);
      
    2. TMyCallbackProc类型的参数添加到Y过程的头部:

      procedure Y(const CallBackProc: TMyCallbackProc; other parameters as needed);
      
    3. Y 过程的主体中的某处添加对所述参数过程的调用:

      …
      CallBackProc(arguments);
      …
      
    4. 从主应用程序调用Y 过程时,根据Y 的声明传递X 过程:

      …
      Y(X, other arguments);
      …
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多