2012-07-27 178 views
1

對於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時,它什麼也不做。我沒有遇到任何錯誤,但經過測試後,它揭示了溝通從未建立,並且沒有成功。如果任何人可以分享任何知識或提供任何資源來幫助,我會非常感激。謝謝你的閱讀。

問候。

+0

WriteFile返回什麼?在'WriteFile'調用之後'lpNumberOfBytesWritten'包含了什麼?另外,爲什麼'lpBuffer'通過引用傳遞? – ken2k 2012-07-27 16:18:01

+0

感謝您的快速回復。在這種情況下,WriteFile返回一個布爾值,爲false。在調用之後,寫入的numberOfBytes仍然爲0,並且從pinvoke.com獲取導入聲明。這是我第一次使用winAPI,我不知道爲什麼它通過引用傳遞 – daniel 2012-07-27 16:24:45

+0

你試過去掉'ref'嗎? – ken2k 2012-07-27 16:31:11

回答

0

刪除WriteFile聲明中的ref

雖然http://www.pinvoke.net/是P/Invoke聲明的一個很好的資源,但它是一個維基風格的網站,很多聲明都是錯誤的(通常它們不適用於x64機器)。