2017-07-26 8 views
1

EXE to DLL Flow ImageVB6は、私は、ハードウェアデバイスと対話するためにイベントを使用してDLLを持っているDLL

INTRO

で完了します。要約すると、ハードウェアインターフェイスDLLがハードウェアでその処理を行い、結果を別のDLLを介してメインコールアプリに返す間に、さまざまな時点でメインのEXEアプリケーションを待機させたいと考えています (上記画像参照)

MODULES

EXEの

STRUCTURE。 は、Calling DLL内のさまざまな関数を呼び出して、オペレーティングDLL内の関数を呼び出す単純なテストアプリケーションです。 最後のデバイスDLLは、製造元の通常のハードウェアディストリビューションドライバタイプDLLです。

呼び出しDLL。 は、さまざまなハードウェアオペレーティングDLLを動的にロードするなど、アプリケーションのさまざまな処理を行う一般的なDLLであり、必要に応じて、さまざまな特定のオペレーティングDLLから変換された共通情報を渡します。それは私が推測するような一種の漏斗です。

オペレーティングDLL; PCに接続されているハードウェアデバイスごとに が存在します。それは、ウェブカメラ、スキャナなどの任意のデバイスの可能性があります。これらのDLLは、一般的な呼び出し側のDLLと片側のメーカーのDLLとの対話のために書かれています。

概要

私はテストのためのEXEに営業DLLをコンパイルすることができています。この状態では、ボタンがいくつかあるフォームがあります。これらのボタンは「開く」「閉じる」「スキャン1」「スキャン2」 オペレーティングDLLがDLLとしてコンパイルされるとき、これらの同じ「ボタン」が呼び出しDLLを介して呼び出されます。希望は意味をなさない。 つまり、ネイティブモードのオペレーティングDLLをEXEとしてテストできます。正常に動作し、呼び出しDLLによって消費されるDLLとしてコンパイルできます。

Scan1とScan2関数はイベント処理を使用します。

オペレーティングDLLをEXEとして、デバイスDLLを介して、オペレーティングDLLからの内部呼び出しを使用して、デバイスに接続して開くことができます。うまく動作し、イベントが機能し、アプリのステップがうまくいきます。これは主に、オペレーティングDLLのフォームレイアウトの構造に似ていることが原因です。イベントは内部的には使用されますが、外部(フォームレベル)ではScan1またはScan2を選択するボタンごとにサイクルを実行するだけです。営業DLLは、ちょうどそのようDLLをコンパイルしたとき

PROBLEM

は問題は、これで、命令は1つのレベル上で呼び出すDLLによって問題です。 Calling DLLにはコードパスがあり、Scan1にそれを伝えるためのOperating DLLへの呼び出しがあります。 これは問題ありません。しかし、呼び出し側の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を表示し、オペレーティングDLL IScanDevice_Scan1関数が完了していない状態でprintReport関数を実行しようとします。

答えて

0

最初の呼び出しからどこに戻ったのかわからない場合は、_Scan1に電話してください。可能であれば、BeginCaptureを呼び出した直後に戻ると、呼び出し元に内部処理やイベントが発生する前に制御を呼び出し元に戻し、プログラムの流れはそこから続行されます。

呼び出されたDLLで処理が中断されることが重要な場合は、呼び出されたDLLに制御の軌跡を保持するか、呼び出し元のDLLで待機してから、発信者。

+0

返信を心より感謝します。正しければ、DLLは主にハードウェアに関連する入力インターフェイスである処理を行い、呼び出し元のDLLに情報を返して終了します。 しかし、私が避けたいと思っていたProcessing DLLのハードなWait in Secondsでは、イベント処理中にDLLに焦点を当てる方法がわかりません。これにはアプローチがありますか? –

+0

@GarthJones呼び出されたDLLが返った後、呼び出されたDLLがイベントやその他の信号を発生させるまで、呼び出し元で不定な待機を行うことができます。これは、すべての処理が完了したときを知る方法があることを前提としています。 VBイベントでこれを達成できない場合は、 'CreateEvent'を使用してイベントをシステムに登録し、呼び出し側でWaitForSingleEventを呼び出し、そのイベントを呼び出し先で通知します。 –

関連する問題