Events VB6如何使EXE在DLL中等待事件完成

Events VB6如何使EXE在DLL中等待事件完成,events,vb6,Events,Vb6,简介 我有一个DLL,它使用事件与硬件设备交互。总之,我想让主EXE应用程序在硬件接口DLL处理硬件时在不同点等待,然后通过另一个DLL将结果传递回主调用应用程序 (见上图) 模块结构 EXE; 只是一个简单的测试应用程序,它调用调用DLL中的各种函数,然后调用操作DLL中的函数。 最后一个设备DLL只是制造商提供的正常硬件分发驱动程序类型DLL 调用DLL; 是一个通用dll,它为我的应用程序执行各种处理,包括根据需要动态加载各种硬件操作dll,传回从各种和更具体的操作dll转换的公共信息。我

简介

我有一个DLL,它使用事件与硬件设备交互。总之,我想让主EXE应用程序在硬件接口DLL处理硬件时在不同点等待,然后通过另一个DLL将结果传递回主调用应用程序 (见上图)

模块结构

EXE; 只是一个简单的测试应用程序,它调用调用DLL中的各种函数,然后调用操作DLL中的函数。 最后一个设备DLL只是制造商提供的正常硬件分发驱动程序类型DLL

调用DLL; 是一个通用dll,它为我的应用程序执行各种处理,包括根据需要动态加载各种硬件操作dll,传回从各种和更具体的操作dll转换的公共信息。我想它有点像漏斗

操作DLL; 每个连接到PC的硬件设备都存在。它可以用于任何设备,如网络摄像头、扫描仪等。这些DLL的编写目的是在一端与通用调用DLL对话,在另一端与制造商DLL对话

摘要

我能够将操作DLL编译成EXE进行测试。在这种状态下,它有一个带有几个按钮的窗体。这些按钮是“打开”“关闭”“扫描1”“扫描2” 当操作DLL编译为DLL时,通过调用DLL调用这些相同的“按钮”。希望这是有道理的。 换句话说,我可以在本机模式下以EXE的形式测试正在运行的DLL,它运行良好,我可以将其编译为DLL,供调用DLL使用

Scan1和Scan2函数使用事件处理

因此,操作DLL作为EXE,我可以通过设备DLL打开并连接到设备,使用来自操作DLL的内部调用。工作正常,事件正常,应用程序步骤正常。这主要是由于我猜操作DLL中表单布局的结构,它只是每个按钮的一部分。它仍然在内部使用事件,但在外部(在表单级别),它只需按照我选择的Scan1或Scan2按钮进行循环

问题

问题是,当操作DLL被编译成那样的DLL时,指令是由调用DLL发出的,而调用DLL是一级以上的。调用DLL有一个代码路径,其中有一个对操作DLL的调用,以将其告知Scan1。 这很好,但是,调用DLL只是继续它的方式,不等待操作DLL完成并返回所需的数据。 因此,调用DLL失败。它只是匆匆通过,没有收到任何数据

代码

这是“调用DLL-它使用操作DLL”

这是“操作DLL-也可以编译为EXE进行测试”


总之,调用的DLL显示MsgBox并尝试运行printReport函数,而操作DLL IScanDevice_Scan1函数未完成

我不清楚您从最初呼叫
\u Scan1
返回的位置/时间。如果调用
BeginCapture
后立即返回,则在被调用方中发生任何内部处理或事件之前,将控制权返回给调用方,程序流从此处继续


如果调用DLL中的处理必须挂起,直到调用DLL中发生某些事情,则必须在调用DLL中保持控制点,或者在调用DLL中等待调用方发出信号通知某些事件。

我不清楚从初始调用返回
\u Scan1
的位置/时间。如果调用
BeginCapture
后立即返回,则在被调用方中发生任何内部处理或事件之前,将控制权返回给调用方,程序流从此处继续


如果调用DLL中的处理必须暂停,直到被调用DLL中发生某些事情,则您必须保持被调用DLL中的控制点,或者在调用DLL中等待调用方通知某个事件。

感谢您的回复。正确,DLL只是进行处理,主要是硬件相关的输入接口,然后返回一些信息给调用DLL。我同意你的看法,但是除了我希望避免的在处理DLL时的几秒钟内的硬等待之外,我看不到在事件处理时保持对DLL焦点的方法。有没有办法解决这个问题?@GarthJones您可以在被调用的DLL返回后,在调用方中无限期等待,直到被调用的DLL引发事件或其他信号。这假设有一种方法可以知道所有处理何时完成。如果无法使用VB事件完成此操作,请使用
CreateEvent
向系统注册事件,在调用者中调用
WaitForSingleEvent
,并在被调用者中发出事件信号。感谢您的回复。正确,DLL只是进行处理,主要是硬件相关的输入接口,然后返回一些信息给调用DLL。我同意你的看法,但是除了我希望避免的在处理DLL时的几秒钟内的硬等待之外,我看不到在事件处理时保持对DLL焦点的方法。有没有办法解决这个问题?@GarthJones您可以在被调用的DLL返回后,在调用方中无限期等待,直到被调用的DLL引发事件或其他信号。这假设有一种方法可以知道所有处理何时完成。如果无法使用VB事件完成此操作,请使用
CreateEvent
向系统注册事件,在调用者中调用
WaitForSingleEvent
,并在被调用者中发出事件信号。
** This function is used to call the Operating DLL and run the Events
**
Private Function IScanDevice_Scan1(Collections As Template, ByVal ScanPurpose As ScanPurposes, ByVal ScanTimeout As Integer, Region As ScanRegion) As Scan_ResultCodes

'* call the Operating DLL processes which use Events 
'*
ScanCollected = Scan1(Collections, ScanPurpose, mScanTimeout, mRegion)


'* The following should only execute after all Operating DLL stuff completes
'*        
   MsgBox ("Scan1 Call for Operating DLL completed)
   Call printResults
.
.
End Function
Option Explicit

Public WithEvents obj As OPOSBiometrics    

''
' This implements the IScanDevice interface.

Implements IScanDevice

.
.

** Used by the Calling DLL    
Public Function IScanDevice_Scan1(Collections As BBScan.Template, ByVal ScanPurpose As BBScan.ScanPurposes, ByVal ScanTimeout As Integer, Region As BBScan.ScanRegion) As BBScan.Scan_ResultCodes
  .
  RC = TestDemo.DoBeginCapture
  .
  .

** This is called from the Form internally when in EXE mode
** and called from the Calling DLL via IScanDevice_Scan1 above
Public Function DoBeginCapture() As RC_ResultCodes
.
  obj.DataEventEnabled = True
  dataEvent = dEvent.BeginCapture
. 
.
Exit Function


'**Event Processing**    
Public Sub obj_DataEvent(ByVal Status As Long)

On Error GoTo Error_DataEvent

Select Case dataEvent

   Case dEvent.Identify
         dataEvent = dEvent.None

   Case dEvent.BeginVerify
CoreScan = obj.BIR
 ret = obj.EndCapture()
If ret = OposSuccess Then
            .
Else
.
End If

            obj.DataEventEnabled = True
dataEvent = dEvent.None

    Case dEvent.Register

            ret = obj.EndCapture()
         If ret = OposSuccess Then
.
         Else
.
         End If

obj.DataEventEnabled = True

         dataEvent = dEvent.None

End Select
.
.
End Sub