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

时间:2017-07-26 09:23:48

标签: events vb6

EXE to DLL Flow Image

INTRO

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

模块的结构

EXE; 它只是一个简单的测试应用程序,它调用Calling DLL中的各种函数,后者又调用操作DLL中的函数。 最后一个Device DLL只是制造商提供的普通硬件分发驱动程序类型DLL。

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

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

概要

我能够将操作DLL编译成EXE进行测试。在这种状态下,它有一个带有几个按钮的表单。这些按钮是" Open" "关闭" " SCAN1" " SCAN2" 这些相同的"按钮"当操作DLL编译为DLL时,通过调用DLL调用。希望有道理。 换句话说,我可以在纯模式下将操作DLL作为EXE进行测试 - 它运行正常,我可以将其编译为DLL,由Calling DLL使用。

Scan1和Scan2功能使用事件处理。

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

问题

问题在于,当操作DLL被编译为DLL时,指令是Calling DLL的问题,这是一个级别的问题。调用DLL有一个代码路径,并且有一个调用操作DLL来告诉它Scan1。 没问题,然而,Calling 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 

总而言之,Calling DLL显示MsgBox并尝试运行printReport函数,而不运行操作DLL IScanDevice_Scan1函数。

1 个答案:

答案 0 :(得分:0)

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

如果重要的是调用DLL中的处理暂停直到被调用的DLL中发生某些事情,则必须将控制轨迹保留在被调用的DLL中,或者在调用DLL中等待某些事件为来自来电者的信号。