注意
この投稿は完全にCypressのCyUSB.dllに依存しており、一般的な解法ではない。
前書き
CypressのFX2やFX3と通信するために用意されているCyUSB.dllでは、現在通信しているUSBデバイスを独占する機能がないようだ。言いかえると、多重起動した他プロセスの同アプリケーションから現在通信中のUSBデバイスを隠したければ、それは自分でやるしかない。
独占を処理するための排他制御には、Mutexを使用することが考えられる。Mutexは名前を示す文字列でもって、現在排他制御中かどうかを識別する。
すると、「現在接続中のUSBデバイスを一意に識別する文字列」を取得しなければならないことがわかる。この値はプロセス間で共通でなければならない。
問題
CypressのCyUSB.dllを使用して、どのようにUSBデバイスを一意に識別する文字列を取得するか。
解法
USBDeviceクラスのPathプロパティを使用する。
このプロパティは、SetupDiGetDeviceInterfaceDetail()が返すDevicePathを返すようだ。
(正確には、SP_DEVICE_INTERFACE_DETAIL_DATA型構造体のDevicePathメンバ)
このDevicePathは、CreateFileなどのWin32関数に渡すことでデバイスにアクセスすることができる。すなわち、デバイス間でユニークな識別子であると言える。
USBDeviceクラスは、オブジェクト間を比較するEquals()メソッドの中でふたつのデバイスのPath文字列を比較しているようなので、この目的で使用しても問題ないだろう。なお、肝心のPathプロパティの説明を読んでもこういったことはまるでわからなかった。