获取错误87,SetupDiGetDeviceInterfaceDetail的参数不正确

问题描述:

我在调用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

对于那些有同样的问题挣扎,你就必须把CBSIZE为sizeof(对象):

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