使用writefile()不能与USB HID设备成功通信
问题描述:
对于C#以及Windows编程,我尝试在Windows XP电脑上建立USB HID设备和用c#编写的应用程序之间的通信。我已经成功地获得该装置的路径和用这个以建立设备上的有效手柄:使用writefile()不能与USB HID设备成功通信
IntPtr drive = CreateFile(devicePath, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero,
OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, IntPtr.Zero);
这被证明是测试时其产生的正整数有效的句柄。在创建句柄后,我调用'HidD_GetPreparsedData'和'HidP_GetCaps',它们产生一个先前导入的结构体(HIDP_CAPS),用于存储与所连接设备相关的特定数据。接着,我尝试调用的WriteFile():
bool success = WriteFile(drive, ref outputReportBuffer,
caps.OutputReportByteLength, ref numberOfBytesWritten,
IntPtr.Zero);
驱动:该装置
outputReportBuffer的手柄:字节数组写[65]
caps.OutputReportByteLength:量要写入的字节,瓶盖是HIDP_CAPS
numberOfBytesWritten的结构:硬编码为0
IntPtr.Zero:我已阅读一切通过这最后parame像我所做的那样。在'writefile'的形式参数中,最后一个参数被列为'IntPtr ipOverlapped',但我一直无法弄清楚它是什么,除了它应该以某种形式传递0
WriteFile如何进口:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool WriteFile(IntPtr hFile,
ref byte[] lpBuffer,
uint nNumberOfBytesToWrite,
ref uint lpNumberOfBytesWritten,
IntPtr ipOverlapped);
当执行writefile时,它什么也不做。我没有遇到任何错误,但经过测试后,它揭示了沟通从未建立,并且没有成功。如果任何人可以分享任何知识或提供任何资源来帮助,我会非常感激。谢谢你的阅读。
问候。
答
删除WriteFile
声明中的ref
。
虽然http://www.pinvoke.net/是P/Invoke声明的一个很好的资源,但它是一个维基风格的网站,很多声明都是错误的(通常它们不适用于x64机器)。
WriteFile返回什么?在'WriteFile'调用之后'lpNumberOfBytesWritten'包含了什么?另外,为什么'lpBuffer'通过引用传递? – ken2k 2012-07-27 16:18:01
感谢您的快速回复。在这种情况下,WriteFile返回一个布尔值,为false。在调用之后,写入的numberOfBytes仍然为0,并且从pinvoke.com获取导入声明。这是我第一次使用winAPI,我不知道为什么它通过引用传递 – daniel 2012-07-27 16:24:45
你试过去掉'ref'吗? – ken2k 2012-07-27 16:31:11