2017-05-19 255 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;'爲什麼你放魔法常數作爲大小?在這兩個調用中你沒有使用相同的參數。 –

+0

您可能想要在繼續​​執行之前驗證SetupDiEnumDeviceInterfaces()的返回值是否爲true。如果由於某種原因,這個調用返回false,你hidDevIData可能包含無效數據將被傳遞給SetupDiGetDeviceInterfaceDetail() –

+0

@布拉-preidžius的事情是把8上都引發錯誤1784(所提供的用戶緩衝區是無效的請求的操作)爲SetupDiEnumDeviceInterfaces,並將sizeof(hidDevIData)放在兩個只會導致程序崩潰。像「myprogram.exe剛剛停止」。 加上這是一個特定USB設備的C#代碼的適應,所以我嘗試儘可能我可以尊重的價值觀。 – sh5164

回答

1

對於那些有同樣的問題掙扎,你就必須把CBSIZE爲sizeof(對象):

hidDevIData.cbSize = sizeof(hidDevIData); 
hidDevIDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);