2017-05-19 60 views
2

SetupDiGetDeviceInterfaceDetail(https://msdn.microsoft.com/en-us/library/ff551120.aspx)を呼び出している間にWindowsエラー87が表示されても、オプションのパラメータをすべてNULLに変更してもエラーが発生しますが、動作する別の関数なので、私はそれらについて間違っていることを理解していません。エラー87、SetupDiGetDeviceInterfaceDetailのパラメータが正しくありません

HDEVINFO hdiInfo = SetupDiGetClassDevsW(&guid, NULL, NULL, 0x12); 

SP_DEVICE_INTERFACE_DATA hidDevIData = SP_DEVICE_INTERFACE_DATA(); 


hidDevIData.cbSize = sizeof(hidDevIData); 
bool isValid = SetupDiEnumDeviceInterfaces(hdiInfo, 0, &guid, i, &hidDevIData); 

if (isValid) 
{ 
    DWORD dwLength; 
    PSP_DEVICE_INTERFACE_DETAIL_DATA hidDevIDetailData = PSP_DEVICE_INTERFACE_DETAIL_DATA(); 
    hidDevIData.cbSize = 8; 
    hidDevIDetailData = new SP_DEVICE_INTERFACE_DETAIL_DATA(); 
    hidDevIDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); 

    SetupDiGetDeviceInterfaceDetail(hdiInfo, &hidDevIData, NULL, 0, &dwLength, NULL); //ERROR 87 : ERROR_INVALID_PARAMETER 
} 

私は本当にどのパラメータが間違っているのかわかりません。これまでのすべての関数はtrueを返します(GUIDは有効です)。

同じ問題に苦しんで人のために
+0

hidDevIData.cbSize = 8 'では、 'なぜあなたはサイズとして魔法の定数を入れたのですか?これらの2つの呼び出しで同じパラメータを使用しませんでした。 –

+0

実行を続行する前に、SetupDiEnumDeviceInterfaces()の戻り値がtrueであることを確認したい場合があります。なんらかの理由でこの呼び出しがfalseを返した場合、hidDevIDataに無効なデータが含まれていて、SetupDiGetDeviceInterfaceDetail()に渡される可能性があります。 –

+0

@ algirdas-preidžius両方ともに8を投げていると、エラー1784が返されます(指定されたユーザーバッファは、 )をSetupDiEnumDeviceInterfacesに設定し、sizeof(hidDevIData)を両方に配置するだけでプログラムがクラッシュします。 「myprogram.exeが停止しました」のように。 これは特定のUSBデバイス用のC#コードの適合ですので、可能な限り値を尊重しようとしています。 – sh5164

答えて

1

、あなただけの(オブジェクト)はsizeofするcbSizeのを配置する必要があります:

hidDevIData.cbSize = sizeof(hidDevIData); 
hidDevIDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); 
関連する問題