2014-09-19 8 views
2

我正在使用CreateFileA,第一次調用它時,它按預期工作。但是當我第二次調用它時,它會返回句柄INVALID_HANDLE_VALUE。可能是什麼問題呢?只是爲了信息,我每次我需要檢查,如果我的USB設備連接時調用它..INVALID_HANDLE_VALUE多次調用CreateFileA

int port = 500; 
char port_name [MAX_CAR] = {0}; 

sprintf_s (port_name, MAX_CAR, "\\\\.\\COM%d", port); 

com->id = CreateFileA (port_name, 
         GENERIC_READ | GENERIC_WRITE, 
         0, 
         NULL, 
         OPEN_EXISTING, 
         FILE_FLAG_OVERLAPPED, 
         NULL); 

編輯:我曾嘗試使用CloseHandle的像CloseHandle的(COM-> ID);但它沒有幫助。

+0

您超出了最大打開文件句柄。確保在使用後關閉手柄以使其無效。 – GlGuru 2014-09-19 13:23:49

+4

只要你不添加適當的錯誤報告,你就會失明。使用GetLastError()在串口調試時永遠不可選,太多的事情可能會出錯,超出你的控制範圍。 – 2014-09-19 13:37:45

+0

您的CloseHandle()調用實際上是否正在執行?當你斷行時,'com-> id'的值是否與CreateFileA()調用返回的值相同?當時你還沒有破壞com?另外,@HansPassant說。 – 2014-09-19 14:24:32

回答

4

documentation

當應用程序使用通過 的CreateFile返回的對象句柄完成後,使用CloseHandle的函數來關閉手柄。這不是 只釋放系統資源,但可以有更廣泛的影響 像共享文件或設備並提交數據到磁盤。根據情況在本主題中註明細節 。

+0

問題是我每次讀/寫文件時都需要關閉句柄。 – user2340939 2014-10-02 07:29:04

1

使用GetLastError獲取錯誤代碼,並使用FormatMessage來獲取人類可讀的錯誤描述,或者只是簡單地谷歌的錯誤代碼。如果沒有GetLastError,你將很難找出真正的原因。