VB6は、私は、ハードウェアデバイスと対話するためにイベントを使用してDLLを持っているDLL
INTRO
で完了します。要約すると、ハードウェアインターフェイスDLLがハードウェアでその処理を行い、結果を別のDLLを介してメインコールアプリに返す間に、さまざまな時点でメインのEXEアプリケーションを待機させたいと考えています (上記画像参照)
MODULESEXEの
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関数を実行しようとします。
返信を心より感謝します。正しければ、DLLは主にハードウェアに関連する入力インターフェイスである処理を行い、呼び出し元のDLLに情報を返して終了します。 しかし、私が避けたいと思っていたProcessing DLLのハードなWait in Secondsでは、イベント処理中にDLLに焦点を当てる方法がわかりません。これにはアプローチがありますか? –
@GarthJones呼び出されたDLLが返った後、呼び出されたDLLがイベントやその他の信号を発生させるまで、呼び出し元で不定な待機を行うことができます。これは、すべての処理が完了したときを知る方法があることを前提としています。 VBイベントでこれを達成できない場合は、 'CreateEvent'を使用してイベントをシステムに登録し、呼び出し側でWaitForSingleEventを呼び出し、そのイベントを呼び出し先で通知します。 –