2011-01-05 438 views
3

有沒有什麼辦法來檢查處理,在通過的CreateFile返回我的情況下,是有效的?有沒有辦法檢查(文件)句柄是否有效?

我面臨的問題是,CreateFile(它不是INVALID_HANDLE_VALUE)返回的有效文件句柄稍後會導致WriteFile失敗,並且GetLastError聲稱這是由於無效句柄。

+4

如果是這樣的情況下,空寫操作,代碼的其他部分必須關閉句柄。 – 2011-01-05 11:04:35

+0

或像SysInternals的Handle.exe一些討厭的工具 – 2011-01-05 15:50:44

回答

0

打開文件被保存在內核中的數據結構,我不認爲有檢測文件句柄一個官方的方法是有效的,只是用它,並檢查錯誤代碼爲INVALID_HANDLE。你確定沒有其他的線程關閉那個文件句柄嗎?

0

您的問題是最有可能造成的任何兩件事情:

  • 您可以關閉文件句柄,但你還是嘗試使用它
  • 文件句柄被覆蓋由於內存損壞

一般是指定INVALID_HANDLE_VALUE每一個處理,只要它不應該包含任何有效的句柄值一個很好的做法。 在簡單的話 - 當你的變量聲明 - 立即將其初始化爲這個值。並且在關閉文件句柄後立即將該值寫入變量。

這會給你的(1)指示 - 嘗試使用已經關閉的文件句柄(或尚未開通)

1

檢查手柄的有效性是一個創可貼,最好。

您應該調試進程 - 在句柄設置(文件打開)時設置斷點,並且當您點擊該代碼並設置句柄後,設置第二個conditional breakpoint以在句柄值更改時觸發。

這將使你制定出的根本原因,而不僅僅是檢查手柄上的每個訪問,這是不可靠的,昂貴的,沒有必要給予正確的邏輯有效。

0

我想補充一下每個人的談話,請確保您檢查返回值,當你調用CreateFile。 IIRC,它會在失敗時返回INVALID_HANDLE_VALUE,此時你應該調用GetLastError找出原因。

2

由於您在關閉它後似乎沒有將句柄值設置爲INVALID_HANDLE_VALUE,我要做的就是在HANDLE變量上設置一個讀取觀察點,這將導致調試器在每行訪問值爲HANDLE。您將能夠看到變量的訪問順序,包括讀取變量時將其傳遞給CloseHandle

參見:Adding a watchpoint (breaking when a variable changes)

1

其他的答案對你的具體問題都非常重要。

但是,如果給出一個HANDLE,並且只是想知道它是否確實是一個開放文件句柄(與例如互斥或GDI對象的句柄等相反),則存在Windows API函數GetFileInformationByHandle

根據不同的權限,你把手授予您的文件,你也可以嘗試使用ReadFile從中讀取一些數據或執行使用WriteFilenNumberOfBytesToWrite設置爲0

相關問題