VB6如何使一个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中的某些事件从呼叫者。
欣赏回复。正确的,DLL只是处理它主要是与硬件有关的输入接口,然后它退出并返回一些信息给调用DLL。 同意你的意见,但除了难以处理的DLL之外,我想避免处理DLL,但在事件处理过程中,我无法看到关注DLL的方式。有没有办法呢? –
@GarthJones在被调用的DLL返回之后,可以在调用者中进行无限期的等待,直到被调用的DLL引发事件或其他信号。这假定有一种方法可以知道所有处理何时完成。如果你无法通过VB事件完成此操作,则使用'CreateEvent'在系统中注册一个事件,在调用者中调用'WaitForSingleEvent',并在被调用者中发送事件。 –