最近,我想使用 C# 来获取 HID 设备。但是我遇到了一些麻烦。
当我使用 SetupDiGetDeviceInterfaceDetail(( 函数时,我会得到错误的路径。
我的获取路径函数代码如下。
private string GetDevicePath(IntPtr hDeviceInfo, ref SP_DEVICE_INTERFACE_DATA devInterfaceData)
{
uint nRequiredSize = 0;
//basically, the first device detailed will return the false... it the really thing.
if (!SetupDiGetDeviceInterfaceDetail(hDeviceInfo, ref devInterfaceData, IntPtr.Zero, (uint)0, ref nRequiredSize, IntPtr.Zero))
{
///Declare Sample 3:
SP_DEVICE_INTERFACE_DETAIL_DATA oDevInterfaceDetailedData = new SP_DEVICE_INTERFACE_DETAIL_DATA();
//Create Buffer to save the path detailed.
oDevInterfaceDetailedData.cbSize = 5; //=5
///With Sample 3:
if (SetupDiGetDeviceInterfaceDetail(hDeviceInfo, ref devInterfaceData,ref oDevInterfaceDetailedData, nRequiredSize, ref nRequiredSize, IntPtr.Zero))
{
//FIXME: Problem 1: The CreateFile will return 123. its means The filename, directory name, or volume label syntax is incorrect.
//https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx
///With Sample 3:
Log.Text += ("Acutal Path = "+ oDevInterfaceDetailedData.DevicePath + "n");
return oDevInterfaceDetailedData.DevicePath;
}
}
return null;
}
问题在这里: oDevInterfaceDetailedData.DevicePath
字符串变量将显示如下消息。
Acutal Path = 屜尿楨⍤楶彤㌰て瀦摩ㅟ㐰⌱☶㐱㡡㈶搷〦〦〰⌰㑻ㅤ㕥戵ⴲㅦ昶ㄭ挱ⵦ㠸扣〭ㄱ〱〰㌰細
我的功能/结构声明如下
[DllImport("setupapi.dll", SetLastError = true)]
protected static extern bool SetupDiGetDeviceInterfaceDetail(IntPtr lpDeviceInfoSet, ref SP_DEVICE_INTERFACE_DATA oInterfaceData, ref SP_DEVICE_INTERFACE_DETAIL_DATA lpDeviceInterfaceDetailData, uint nDeviceInterfaceDetailDataSize, ref uint nRequiredSize, IntPtr lpDeviceInfoData);
[DllImport("setupapi.dll", SetLastError = true)]
protected static extern bool SetupDiGetDeviceInterfaceDetail(IntPtr lpDeviceInfoSet, ref SP_DEVICE_INTERFACE_DATA oInterfaceData, IntPtr lpDeviceInterfaceDetailData, uint nDeviceInterfaceDetailDataSize, ref uint nRequiredSize, IntPtr lpDeviceInfoData);[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct SP_DEVICE_INTERFACE_DETAIL_DATA
{
public uint cbSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string DevicePath;
}
我的平台是64位Windows操作系统。我使用 VS2017 IDE 在 C# 中构建一个 WPF 项目。
有人可以帮助我弄清楚问题是.....多谢
-
您尝试使用代码:
[DllImport(@"setupapi.dll", CharSet = CharSet.Auto, SetLastError = true(]
public static extern Boolean SetupDiGetDeviceInterfaceDetail( IntPtr hDevInfo, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData, IntPtr deviceInterfaceDetailData, UInt32 deviceInterfaceDetailDataSize, 输出 UInt32 必需大小, IntPtr deviceInfoData );
-
感兴趣的人参考。 这里
- 而这里
谢谢 Hans Passant。
我终于修改了SP_DEVICE_INTERFACE_DETAIL_DATA结构。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct SP_DEVICE_INTERFACE_DETAIL_DATA
{
public uint cbSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string DevicePath;
}
字符集需要使用 ansi 而不是自动...