2017-07-26 34 views
1

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函數未完成。

回答

0

我不清楚在哪裏/何時從最初的電話回到_Scan1。如果看起來很可能在調用BeginCapture後立即返回,那麼在被調用者發生任何內部處理或事件之前,您將控制權返回給調用者,並且程序從此處繼續。

如果在被調用的DLL中發生某些事情時暫停調用DLL中的處理很重要,則必須將控件的軌跡保存在調用的DLL中,或者等待調用DLL中的某些事件從呼叫者。

+0

欣賞回覆。正確的,DLL只是處理它主要是與硬件有關的輸入接口,然後它退出並返回一些信息給調用DLL。 同意你的意見,但除了難以處理的DLL之外,我想避免處理DLL,但在事件處理過程中,我無法看到關注DLL的方式。有沒有辦法呢? –

+0

@GarthJones在被調用的DLL返回之後,可以在調用者中進行無限期的等待,直到被調用的DLL引發事件或其他信號。這假定有一種方法可以知道所有處理何時完成。如果你無法通過VB事件完成此操作,則使用'CreateEvent'在系統中註冊一個事件,在調用者中調用'WaitForSingleEvent',並在被調用者中發送事件。 –