Ric*_*ter 5 .net c# usb pinvoke winapi
我对.net/C#相对较新(虽然在Win32/MFC和其他平台上非常有经验)并且需要编写一个实用程序来与自定义USB HID设备通信.该协议非常简单,我已经有了一个用MFC编写的工作实用程序,但我更愿意在.Net/C#中编写该实用程序,因为我试图随着时间的推移而离开MFC.
我做了一些调查,发现这篇文章似乎有助于我理解如何从.Net/C#访问HID设备,特别是因为它只是调用了我已经熟悉的Win32 API调用:
http://www.developerfusion.com/article/84338/making-usb-c-friendly/
提供的示例代码给了我一个很好的介绍,如何访问Win32 API调用与USB设备通信(就像我以前的MFC代码一样),这一切都适用于Windows Vista或7的32位安装,但是当我尝试在64位安装上运行相同的代码,但它失败了.即使我尝试创建专用的64位应用程序,它仍然会失败.
我很确定问题是Marshal如何将参数(在堆栈上?)传递给Win32 API,但是我在这个阶段对.Net/C#的知识和经验还不够准确地理解问题是如何解决它 - 问题可能比我目前的水平更先进.
在我达到指令之前,一切似乎都在代码中正常工作......
while (SetupDiEnumDeviceInterfaces(hInfoSet, 0, ref gHid, (uint)nIndex, ref oInterface)) // this gets the device interface information for a device at index 'nIndex' in the memory block
Run Code Online (Sandbox Code Playgroud)
其中SetupDI ...在32位系统上返回true,然后遍历所有连接的USB设备,但在64位系统上返回false.我很确定这可能是参数如何传递到Win32 API函数的问题,但我不明白究竟是什么问题.该函数的DLLImport定义是:
[DllImport("setupapi.dll", SetLastError = true)] protected static extern bool SetupDiEnumDeviceInterfaces(IntPtr lpDeviceInfoSet, uint nDeviceInfoData, ref Guid gClass, uint nIndex, ref DeviceInterfaceData oInterfaceData);
Run Code Online (Sandbox Code Playgroud)
我想知道是否有人能够建议可能的违规参数是什么以及我如何解决它?
在此先感谢您提供的任何帮助,如果需要更多信息,请提出要求!丰富
来自MSDN:
BOOL SetupDiEnumDeviceInterfaces( __in HDEVINFO DeviceInfoSet, __in_opt PSP_DEVINFO_DATA DeviceInfoData, __in const GUID *InterfaceClassGuid, __in DWORD MemberIndex, __out PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData );DeviceInfoData [in,optional]
指向SP_DEVINFO_DATA结构的指针...
请注意,DeviceInfoData是一个指针 - 所以应该是IntPtr,而不是uInt:
[DllImport("setupapi.dll", SetLastError = true)] protected static
extern bool SetupDiEnumDeviceInterfaces(IntPtr lpDeviceInfoSet,
IntPtr pDeviceInfoData, ref Guid gClass,
uint nIndex, ref DeviceInterfaceData oInterfaceData);
调用它时,传递IntPtr.Zero而不是0.
您也许可以通过检查 的值来追踪有问题的参数问题(如果确实如此),该值可以从.NET 应用程序中 GetLastError获取。Marshal.GetLastWin32Error()
一个可能的问题可能是oInterface变量的初始化方式。应该设置 cbSize 元素。该结构 (SP_DEVICE_INTERFACE_DATA) 的 64 位版本可能比 32 位版本更大。刚才简单看了一下,脑子里算了一下(总是容易出错),看起来32位版本是28字节,64位版本是32字节。
| 归档时间: |
|
| 查看次数: |
4929 次 |
| 最近记录: |