【问题标题】:Why does CreateFile return invalid handle?为什么 CreateFile 返回无效句柄?
【发布时间】:2011-05-08 07:00:03
【问题描述】:

我有CreateFile() 创建一个隐藏文件类型,但问题是它一直返回无效句柄。

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

有什么想法吗?

【问题讨论】:

  • 我看不出你的代码有什么问题。 GetLastError() 报告的错误是什么(如果有的话)?你怎么知道file 是一个无效句柄?此外,此代码不会创建隐藏文件。
  • 好吧,我使用了 GetLastError(),我得到“失败,错误 6:无效句柄”
  • 你确定是 CreateFileW 之后的错误,而不是 WriteFile 之后的错误吗?您没有包含hey.txt 的路径,可能您在使用的位置没有写入权限。并且不需要使用 CreateFileW,CreateFile 也可以。
  • 谢谢,我无权访问它。谢谢

标签: c++ winapi file-management


【解决方案1】:

如果您显示您正在使用的确切代码,包括所有错误检查,以及您如何做,这可能是最好的(尤其是在这个问题的情况下)...

对代码的正确错误检查应该类似于...

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 的回答。

【讨论】:

    【解决方案2】:

    0 不是dwFlagsAndAttributes 的有效参数。要创建隐藏文件,请传递FILE_ATTRIBUTE_HIDDEN

    【讨论】:

    • 请告诉我们调用 CreateFile 后文件的数值以及 GetLastError 在 CreateFile 之后立即返回的内容。
    【解决方案3】:

    如果“C:\test.txt”存在并且被隐藏,那么下面的代码会失败(h = INVALID_HANDLE_VALUE):

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

    这也失败了(参数 6 == FILE_ATTRIBUTES_NORMAL 或参数6 == 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 将失败。

    【讨论】:

    • 顺便说一句:CreateFile 的在线文档指出:Windows Server 2003 和 Windows XP:如果指定了 CREATE_ALWAYS 和 FILE_ATTRIBUTE_NORMAL,则 CreateFile 失败并将最后一个错误设置为 ERROR_ACCESS_DENIED 如果文件存在并且具有 FILE_ATTRIBUTE_HIDDEN 或FILE_ATTRIBUTE_SYSTEM 属性。为避免该错误,请指定与现有文件相同的属性。
    猜你喜欢
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2023-04-03
    相关资源
    最近更新 更多