有沒有什麼辦法來檢查處理,在通過的CreateFile返回我的情況下,是有效的?有沒有辦法檢查(文件)句柄是否有效?
我面臨的問題是,CreateFile(它不是INVALID_HANDLE_VALUE)返回的有效文件句柄稍後會導致WriteFile失敗,並且GetLastError聲稱這是由於無效句柄。
有沒有什麼辦法來檢查處理,在通過的CreateFile返回我的情況下,是有效的?有沒有辦法檢查(文件)句柄是否有效?
我面臨的問題是,CreateFile(它不是INVALID_HANDLE_VALUE)返回的有效文件句柄稍後會導致WriteFile失敗,並且GetLastError聲稱這是由於無效句柄。
打開文件被保存在內核中的數據結構,我不認爲有檢測文件句柄一個官方的方法是有效的,只是用它,並檢查錯誤代碼爲INVALID_HANDLE。你確定沒有其他的線程關閉那個文件句柄嗎?
您的問題是最有可能造成的任何兩件事情:
一般是指定INVALID_HANDLE_VALUE
每一個處理,只要它不應該包含任何有效的句柄值一個很好的做法。 在簡單的話 - 當你的變量聲明 - 立即將其初始化爲這個值。並且在關閉文件句柄後立即將該值寫入變量。
這會給你的(1)指示 - 嘗試使用已經關閉的文件句柄(或尚未開通)
檢查手柄的有效性是一個創可貼,最好。
您應該調試進程 - 在句柄設置(文件打開)時設置斷點,並且當您點擊該代碼並設置句柄後,設置第二個conditional breakpoint以在句柄值更改時觸發。
這將使你制定出的根本原因,而不僅僅是檢查手柄上的每個訪問,這是不可靠的,昂貴的,沒有必要給予正確的邏輯有效。
我想補充一下每個人的談話,請確保您檢查返回值,當你調用CreateFile
。 IIRC,它會在失敗時返回INVALID_HANDLE_VALUE
,此時你應該調用GetLastError
找出原因。
由於您在關閉它後似乎沒有將句柄值設置爲INVALID_HANDLE_VALUE
,我要做的就是在HANDLE
變量上設置一個讀取觀察點,這將導致調試器在每行訪問值爲HANDLE
。您將能夠看到變量的訪問順序,包括讀取變量時將其傳遞給CloseHandle
。
其他的答案對你的具體問題都非常重要。
但是,如果給出一個HANDLE
,並且只是想知道它是否確實是一個開放文件句柄(與例如互斥或GDI對象的句柄等相反),則存在Windows API函數GetFileInformationByHandle。
根據不同的權限,你把手授予您的文件,你也可以嘗試使用ReadFile從中讀取一些數據或執行使用WriteFile與nNumberOfBytesToWrite
設置爲0
如果是這樣的情況下,空寫操作,代碼的其他部分必須關閉句柄。 – 2011-01-05 11:04:35
或像SysInternals的Handle.exe一些討厭的工具 – 2011-01-05 15:50:44