次の方法で共有


DirectX 5.0 インターフェイス

VJoyD とその以前のバージョンは、DirectX 5.0 以降のインターフェイスを認識できません。 そのため、ミニドライバーは、登録を試みる前に VJoyD のバージョンをチェックすることが不可欠です。 VJoyD では、標準バージョンのメッセージはサポートされていません。 そのため、これを手動で実装するには、VJoyD のデバイス記述子ブロック (DDB) を取得し、DDB でマークされたバージョンをチェックする必要があります。 これを実装する方法の詳細については、例のサンプル ドライバーを参照してください。 DDB でマークされているバージョンが、バージョン リソースでマークされているバージョンと同じではないことに注意してください。

ミニドライバーがコールバックを登録するプロセスは大幅に拡張され、DirectX 5.0 で開始されます。

以前と同様に VJoyD、または外部所有者 (HID スタックなど) がミニドライバーを読み込むことができます。 VJoyD がデバイスを読み込むときは、ミニドライバーが VJoyD VJOYD_Register_Device_Driver サービスを使用して自身を登録する必要があります。 ただし、ミニドライバーは登録を求める 3 つのシステム制御メッセージを受け取る場合があります。 1 つ目は SYS_DYNAMIC_DEVICE_INIT メッセージで、VJoyD が読み込まれる前に VxD が読み込まれていない場合にミニドライバーが受信します。 これは、登録に使用される元のインターフェイスと同じメカニズムを使用します。 これは VxD の新規読み込みであるため、定義された INIT セクションはすべて使用可能です。 このメッセージを受信すると、VxD は内部初期化を実行し、VJoyD に登録します。

アプリケーションが既にミニドライバーを読み込んでいる場合 (たとえば、アプリケーションがプライベート IOCTL インターフェイスを使用するためにミニドライバーを読み込んでいる場合)、VJoyD がミニドライバーを読み込むときにこのメッセージを再度受信することはありません。 このような状況では、Windows 98 は SYS_DYNAMIC_DEVICE_REINIT メッセージを発行し、それに応じてミニドライバーは VJoyD に登録する必要があります。 これは VxD の新規読み込みではないため、INIT セクションは使用できなくなりました。 Windows 98 で動作しないミニドライバーの場合、VJoyD は、VxD が既にロードされているため、応答がないことを考慮してミニドライバーを読み込みます。 VJoyD は、ダイレクト システム制御メッセージ BEGIN_RESERVED_PRIVATE_SYSTEM_CONTROL を発行し、ミニドライバーはこれに応答して登録する必要があります。

VJoyD は、読み込み時の登録に加えて、ドライバーが駆動するデバイスの状態の変化を検出したときに、新しい種類の登録を受け入れるようになりました。 コールバックに加えて、DirectX 5.0 インターフェイスを使用すると、登録時にさまざまな制御パラメーターとデバイスの説明を設定できます。 これには、デバイスの完全な説明 (調整情報を含む) が含まれており、検出された他のデバイスに合わせて変更できます。

DirectX 5.0 以降のインターフェイスのジョイスティック ミニドライバー コールバックは、コントロール コールバック、ポーリング コールバック、およびフォース フィードバック コールバックで構成されます。 これらの変更に対応するために、VJoyD VJOYD_Register_Device_Driver サービスはオーバーロードされるため、EAX は新しい登録が使用されていることを示す 0xFFFFFFFF を保持し、ECX はパラメーターを保持する構造体へのポインターを保持します。 EBX と EDX の値は未定義であり、ドライバーは EBX が呼び出しから破損していない状態で返されると想定する場合があります。

次の表に、ジョイスティック ミニドライバーの登録シーケンスを示します。

   
mov eax, 0ffffffffh
mov ecx, offset32 RegData
VxDcall VJOYD_Register_Device_Driver

VJREGDRVINFO 構造体が新しい登録に渡されます。

VJREGDRVINFO 構造体の dwFunction メンバーは、VJRT_LOADED である必要があります。その他の値はすべて予約されています。 VJRT_LOADED は、元のインターフェイスで登録が使用されるのと同じ方法で、新しいインターフェイスで使用されます。 つまり、読み込まれているミニドライバーに応答して、コールバックを VJoyD に渡します。

すべてのドライバーがコントロール コールバックを提供する必要があり、出力のみのデバイスはほとんどないため、コントロール コールバックとポーリング コールバックは 1 つのテーブルにマージされます。 これらのコールバックは、VJPOLLREG 構造体を使用して登録されます。

VJPOLLREG 構造体の lpCfg メンバーは、元のインターフェイスの CfgRoutine とまったく同じように、標準の構成マネージャー コールバックを指します。 大きな違いは、VJoyD が必要に応じて構成マネージャー コールバックを呼び出す点です。 VJoyD は、ドライバーをインストール済みのデバイス ノードにリンクし、このコールバックを呼び出して、構成マネージャーのアクティビティをドライバーに通知します。 以前のインターフェイスでは、構成マネージャーのコールバックごとに読み込まれたすべてのドライバーが呼び出されましたが、DirectX 5.0 以降のインターフェイスでは、変更されたデバイス ノードにリンクされている 1 つのドライバーのみが呼び出されます。 また、ドライバーが読み込まれていないときに構成マネージャーのアクティビティが発生する可能性があるため、VJoyD はプリミティブ キャッシュ システムを実装し、デバイス ノードが開始されている場合、このデバイス ノードが読み込まれたときにドライバーに通知されるようにします。

ドライバーはリソース割り当てのために常に呼び出されるため、必要なリソースを見つけるために既定のポートをチェックすべきではありません。 残念ながら、以前のインターフェイスで動作するために何らかの方法を見つける必要があったドライバーは、依然として古い方法で動作します。 つまり、VJoyD は単一のドライバーに一連のリソースを割り当てるだけですが、読み込まれた古いドライバーでは、割り当てられていないポートを引き続き使用できます。 リソースが割り当てられている場合、ドライバーは、デバイスの状態を判断するためにデバイスに必要なすべてのハンドシェイクを実行する必要があります。

Initialize コールバック (VJPOLLREG 構造体の fpInitialize メンバーが指す) は、以前のインターフェイスの JoyId コールバックを置き換えます。 主な違いは、ドライバーが複数のデバイスをサポートする場合にインスタンスを区別できるように、登録時にデバイスが VJoyD に渡したデバイス インスタンス ID を VJoyD がドライバーに返すことです。

Note

レジストリ キーを開く必要がある場合は、レジストリ キーを直接開くのではなく、VJOYD_OpenConfigKey_Service マクロと VJOYD_OpenTypeKey_Service マクロを使用する必要があります。 これらのサービス マクロを使用すると、正しいレジストリ ブランチが確実に開きます。 さらに、基になるレジストリ データの構造が異なる場合は、DirectInput の将来のバージョンでサービス マクロがサポートされる予定です。