VB6如何使一个EXE等待事件在DLL

问题描述:

EXE to DLL Flow ImageVB6如何使一个EXE等待事件在DLL

INTRO

完成我有一个使用事件来与硬件设备交互的DLL。总之,我希望主要的EXE应用程序能够在各个点上等待,而硬件接口DLL完成硬件的功能,然后通过另一个DLL (见上图)将结果传递回主呼叫应用程序

MODULES

的EXE的

结构; 只是一个简单的测试应用程序,该应用程序调用调用DLL中的各种函数,调用DLL又调用操作DLL中的函数。 最后一个设备DLL只是制造商的正常硬件分布驱动程序类型DLL。

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

操作DLL;每个连接到PC的硬件设备都存在 。它可能适用于任何设备,如网络摄像头,扫描仪等。这些DLL的编写是为了与一般的Calling DLL和另一端的制造商DLL进行通信。

摘要

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

Scan1和Scan2函数使用事件处理。

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

问题

的问题是这样的,当操作DLL被编译为仅仅是一个DLL,该指令是由调用DLL这是一个级别的问题。调用DLL有一个代码路径,并且有一个调用操作DLL来告诉它Scan1。 这很好,但是,调用DLL只是继续它的方式,并不等待操作DLL完成并返回所需的数据。 因此调用DLL失败。它只是冲过来,并没有收到任何数据。

CODE

这是 “调用DLL - 它消耗的操作DLL”

** 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 

这是“操作DLL - 也可以被编译成用于测试的EXE “

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 

所以在总结调用DLL将显示MsgBox并尝试运行printReport函数,但操作DLL IScanDevice_Scan1函数未完成。

我不清楚在哪里/何时从最初的电话回到_Scan1。如果看起来很可能在调用BeginCapture后立即返回,那么在被调用者发生任何内部处理或事件之前,您将控制权返回给调用者,并且程序从此处继续。

如果在被调用的DLL中发生某些事情时暂停调用DLL中的处理很重要,则必须将控件的轨迹保存在调用的DLL中,或者等待调用DLL中的某些事件从呼叫者。

+0

欣赏回复。正确的,DLL只是处理它主要是与硬件有关的输入接口,然后它退出并返回一些信息给调用DLL。 同意你的意见,但除了难以处理的DLL之外,我想避免处理DLL,但在事件处理过程中,我无法看到关注DLL的方式。有没有办法呢? –

+0

@GarthJones在被调用的DLL返回之后,可以在调用者中进行无限期的等待,直到被调用的DLL引发事件或其他信号。这假定有一种方法可以知道所有处理何时完成。如果你无法通过VB事件完成此操作,则使用'CreateEvent'在系统中注册一个事件,在调用者中调用'WaitForSingleEvent',并在被调用者中发送事件。 –