2011-05-08 124 views
0

我有CreateFile()創建一個隱藏的文件類型,但它一直返回無效句柄的問題。爲什麼CreateFile返回無效句柄?

file = CreateFileW(_T("hey.txt"), 
        GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 
        0, 0); 
error = GetLastError(); 
WriteFile(file, buff, sizeof(buff), 
      &dwRet, NULL); 

任何想法?

+1

我在代碼中看不到任何錯誤。 GetLastError()報告的錯誤是什麼(如果有的話)?你怎麼知道'file'是一個無效的句柄?而且,這段代碼不會創建隱藏文件。 – gd1 2011-05-08 07:02:46

+0

那麼我使用GetLastError(),我得到「失敗,錯誤6:無效句柄」 – Mike 2011-05-08 07:06:06

+2

你確定這是CreateFileW後的錯誤,而不是WriteFile後的錯誤?您不包含'hey.txt'的路徑,也許您在所使用的位置沒有寫權限。並且不需要使用CreateFileW,CreateFile也可以。 – wimh 2011-05-08 07:17:54

回答

4

它可能是最好的,如果你發現你正在使用包括所有的錯誤檢查確切的代碼,你如何做到這一點,是很重要的(尤其是在這個問題的情況下)...

正確的錯誤檢查你的代碼應該是更像...

file = CreateFile(_T("hey.txt"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); 

if (file == INVALID_HANDLE_VALUE) 
{ 
    const DWORD error = GetLastError(); 

    // Do something! 
} 
else 
{ 
    if (!WriteFile(file, buff, sizeof(buff), &dwRet, NULL)) 
    { 
     const DWORD error = GetLastError(); 

     // Do something! 
    } 
} 

,如果你得到的INVALID_FILE_HANDLE一個返回值CreateFile()開始之前可能無法重置最後一個錯誤,您應該只檢查一個錯誤,所以如果功能成功,您可能會從GetLastError()得到虛假的錯誤值...

6,ERROR_INVALID_HANDLE最後一個錯誤,是不尋常的,從CreateFile(),除非你正在使用的模板文件參數,你不是......

使用CreateFileW和_T(「」)你的代碼是不正確並且不會在非Unicode構建中編譯。更好使用CreateFile和_T(「」)或CreateFileW和L「」。

您的代碼不會創建隱藏文件,請參閱molbdnilo的答案。

3

0不是dwFlagsAndAttributes的有效參數。要創建隱藏文件,請通過FILE_ATTRIBUTE_HIDDEN

+0

我得到了同樣的錯誤 – Mike 2011-05-08 07:09:25

+0

任何其他的想法? – Mike 2011-05-08 07:17:32

+0

如何在調用CreateFile之後告訴我們文件的數值,以及GetLastError在CreateFile之後立即返回的內容。 – 2011-05-08 07:35:41

0

如果 「C:\ test.txt的」 存在是隱藏的,則下面的代碼失敗(H = INVALID_HANDLE_VALUE):

h = CreateFile("C:\\test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); 

失敗太(參數6 == FILE_ATTRIBUTES_NORMAL或argument6 == 0顯得那麼是相同的):

h = CreateFile("C:\\test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 

但這個工程:

h = CreateFile("C:\\test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, 0); 

大致換句話說: 如果文件已經存在並且被隱藏,那麼如果參數6!= FILE_ATTRIBUTE_HIDDEN,則帶有「CREATE_ALWAYS」的CreateFile失敗。

+0

BTW:CreateFile的聯機文檔陳述如下: Windows Server 2003和Windows XP:如果指定了CREATE_ALWAYS和FILE_ATTRIBUTE_NORMAL,則CreateFile將失敗並將最後一個錯誤設置爲ERROR_ACCESS_DENIED,如果該文件存在並且具有FILE_ATTRIBUTE_HIDDEN或FILE_ATTRIBUTE_SYSTEM屬性。爲避免該錯誤,請指定與現有文件相同的屬性。 – 2011-08-17 10:05:11

相關問題