为什么 CreateFile 返回无效句柄?
我有 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您显示您正在使用的确切代码(包括所有错误检查)以及如何执行此操作,这可能是最好的,这很重要(特别是在这个问题的情况下)...
对代码的正确错误检查应该更像是...
如果您收到
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...
You should only be checking for an error if you get a return value of
INVALID_FILE_HANDLE
asCreateFile()
might not reset the last error before it starts and so you might get spurious error values fromGetLastError()
if the function succeeds...A last error of 6,
ERROR_INVALID_HANDLE
, is unusual fromCreateFile()
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 useCreateFile
and _T("") orCreateFileW
and L"".Your code will not create a hidden file, see molbdnilo's answer.
0
不是dwFlagsAndAttributes
的有效参数。要创建隐藏文件,请传递FILE_ATTRIBUTE_HIDDEN
。0
is not a valid parameter fordwFlagsAndAttributes
. To create a hidden file, passFILE_ATTRIBUTE_HIDDEN
.如果“C:\test.txt”存在并且被隐藏,则以下代码将失败(h = INVALID_HANDLE_VALUE):
这也会失败(参数 6 == FILE_ATTRIBUTES_NORMAL 或 argument6 == 0 似乎是相同的):
但这有效:
换句话说就是:
如果文件已存在且处于隐藏状态,则如果参数 6 != FILE_ATTRIBUTE_HIDDEN,则使用“CREATE_ALWAYS”的 CreateFile 将失败。
If "C:\test.txt" exists and is hidden, then following code fails (h = INVALID_HANDLE_VALUE) :
this fails too (argument 6 == FILE_ATTRIBUTES_NORMAL or argument6 == 0 seems so be the same) :
but this works :
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.