Windows 7 64位和通过P/Invoke访问Win32 API调用;元帅的问题

本文关键字:调用 API Win32 问题 访问 Invoke 64位 Windows | 更新日期: 2023-09-27 18:06:24

我对。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代码一样),这一切都在32位安装的Windows Vista或7上工作得很好,但是当我试图在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

其中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);

我想知道是否有人能够建议违规参数可能是什么以及我如何修复它?

提前感谢您提供的任何帮助,如果需要更多的信息,请询问!丰富的

Windows 7 64位和通过P/Invoke访问Win32 API调用;元帅的问题

From 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外部bool SetupDiEnumDeviceInterfaces(IntPtr lpDeviceInfoSet,IntPtr pDeviceInfoData, ref Guid gClass,int index (ref DeviceInterfaceData);之前

调用时,传递IntPtr。用0代替0

您可以通过检查GetLastError的值来跟踪违规参数问题(如果是这样的话),该值可以在。net应用程序中从Marshal.GetLastWin32Error()获得。

一个可能的问题可能是如何初始化oInterface变量。应该设置cbSize元素。并且该结构的64位版本(SP_DEVICE_INTERFACE_DATA)可能比32位版本大。我刚才简单地看了一下,并在脑子里数了数(总是容易出错),看起来32位版本将是28字节,64位版本将是32字节。