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函数。
答案 0 :(得分:0)
我不清楚从最初的_Scan1
电话回来的时间/地点。如果很可能在调用BeginCapture
之后立即返回,那么在调用者发生任何内部处理或事件之前,您将向调用者返回控制权,并且程序流从那里继续。
如果重要的是调用DLL中的处理暂停直到被调用的DLL中发生某些事情,则必须将控制轨迹保留在被调用的DLL中,或者在调用DLL中等待某些事件为来自来电者的信号。