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函數未完成。
欣賞回覆。正確的,DLL只是處理它主要是與硬件有關的輸入接口,然後它退出並返回一些信息給調用DLL。 同意你的意見,但除了難以處理的DLL之外,我想避免處理DLL,但在事件處理過程中,我無法看到關注DLL的方式。有沒有辦法呢? –
@GarthJones在被調用的DLL返回之後,可以在調用者中進行無限期的等待,直到被調用的DLL引發事件或其他信號。這假定有一種方法可以知道所有處理何時完成。如果你無法通過VB事件完成此操作,則使用'CreateEvent'在系統中註冊一個事件,在調用者中調用'WaitForSingleEvent',並在被調用者中發送事件。 –