4

GetRawInputDeviceInfoUSB HID デバイス名のデバイス名を取得するために使用しています。

\??\何らかの理由で、Windows XP でコードを実行すると、 ではなくで始まるデバイス名が表示されます\\?\

もちろん、これは、このデバイス名を使用しようとしても機能しないことを意味します (CreateFileたとえば、「機能しません。デバイス名を編集して手動で修正すると、\\?\すべてがうまく機能します。

これは、Windows 7 では発生しません。Win7 では、すべてがうまく機能します。

また、すべての API 呼び出しの後にテストを行いGetLastErrorますが、エラーは発生しません。

私の OS はすべて 32 ビットで、私のプロジェクトは Unicode でコンパイルしています。

私が間違っていることは何ですか?? デバイス名を取得するコンソール アプリケーションのコード スニペットを次に示します。

nResult = GetRawInputDeviceInfo( pDeviceList[i].hDevice, RIDI_DEVICENAME, NULL, &nBufferSize );
if( nResult < 0 )
{
cout << "ERR: Unable to get Device Name character count.." << endl;
return false;
}
WCHAR* wcDeviceName = new WCHAR[ nBufferSize + 1 ];
if( wcDeviceName == NULL )
{
cout << "ERR: Unable to allocate memory for Device Name.." << endl;
return false;
}
nResult = GetRawInputDeviceInfo( pDeviceList[i].hDevice, RIDI_DEVICENAME, wcDeviceName, &nBufferSize );
if( nResult < 0 )
{
cout << "ERR: Unable to get Device Name.." << endl;
delete [] wcDeviceName;
return false;
}
wcDeviceName[1]='\\';
//This is the manual fix for the device name in WinXP. How do I get rid of it????
pDesc->hHandle = CreateFile(wcDeviceName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
...

...
4

1 に答える 1

6

あなたは何も悪いことをしていません。

2 番目の文字を に変更するだけ\で設定完了です。表示されるのは、ネイティブ形式の raw デバイス パスです ( \??\...)。オブジェクト ディレクトリ\\?\に対する Win32 サブシステムの制限にもかかわらず、NT が登場したときに Win32 で長いパス名を使用できるようにするために MS が発明した松葉杖であるフォームがある場合。\??

Russinovich による "Windows Internals" のいくつかの章を読み (古い版でも構いません)、Sysinternals の winobj.exe を使用して Windows のオブジェクト名前空間を探索し、私が話していることを確認してください。

補足:CreateFileコードを呼び出すkernel32.dllと、ネイティブ関数がパスを確認する前に、提案された変更が文字通り元に戻され、ネイティブ形式に変換されます。したがって、これで行うことは、Win32 レイヤーにパスを理解させることだけです。

于 2012-05-29T13:00:25.947 に答える