为什么 CreateFile 返回无效句柄?

发布于 2024-11-06 01:58:11 字数 309 浏览 5 评论 0原文

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

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

有什么想法吗?

I have CreateFile() to create a hidden file type but the problem that it keeps returning invalid handle.

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

Any idea?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

_蜘蛛 2024-11-13 01:58:11

如果您显示您正在使用的确切代码(包括所有错误检查)以及如何执行此操作,这可能是最好的,这很重要(特别是在这个问题的情况下)...

对代码的正确错误检查应该更像是...

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

It would probably be best if you showed the exact code that you're using including all the error checking, and how you do it, is important (especially in the case of this question)...

The correct error checking for your code should be something more like...

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!
   }
}

You should only be checking for an error if you get a return value of INVALID_FILE_HANDLE as CreateFile() might not reset the last error before it starts and so you might get spurious error values from GetLastError() if the function succeeds...

A last error of 6, ERROR_INVALID_HANDLE, is unusual from CreateFile() unless you're using the template file parameter, which you're not...

Your code using CreateFileW and _T("") is incorrect and wont compile in a non unicode build. Better to use CreateFile and _T("") or CreateFileW and L"".

Your code will not create a hidden file, see molbdnilo's answer.

自找没趣 2024-11-13 01:58:11

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

0 is not a valid parameter for dwFlagsAndAttributes. To create a hidden file, pass FILE_ATTRIBUTE_HIDDEN.

来日方长 2024-11-13 01:58:11

如果“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 将失败。

If "C:\test.txt" exists and is hidden, then following code fails (h = INVALID_HANDLE_VALUE) :

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

this fails too (argument 6 == FILE_ATTRIBUTES_NORMAL or argument6 == 0 seems so be the same) :

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

but this works :

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

So roughly in other words :
if the file already exists and is hidden then CreateFile with "CREATE_ALWAYS" fails if argument 6 != FILE_ATTRIBUTE_HIDDEN.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文