我们目前面临调用WriteFile
(或者更确切地说是CFile :: Write - 但只是在内部调用WriteFile)的问题,导致Win32错误5
ERROR_ACCESS_DENIED
。
(编辑:请注意,我们无法重现行为。我们目前只有一个日志文件,指示CFile :: Write所在的源行,并包含错误ERROR_ACCESS_DENIED!)
(编辑:该文件位于本地驱动器上,实际上它是一个文件而不是目录。)
现在,WriteFiles's documentation并没有真正帮助,尝试使用简单的测试应用会产生以下结果:
32
ERROR_SHARING_VIOLATION)。这让我们了解情况,如果文件实际上是用read标志而不是write标志打开的话,那么这个调用的唯一可能性就是失败了。但是,看看我们的代码,这似乎不太可能。 (由于我们的跟踪,我们可以确保WriteFile失败并且我们可以确保错误是ERROR_ACCESS_DENIED,我们不能100.1%确定开放标志,因为这些没有被追溯。)
是否存在WriteFile(CFile :: Write)会导致ERROR_ACCESS_DENIED的其他已知情况?
注意:另外澄清这个问题的背景:
我应该补充一点,我们在WIndows XP sp3上运行,应用程序是用Visual Studio 2005编译的。
答案 0 :(得分:4)
问题是
是什么导致WriteFile返回 ERROR_ACCESS_DENIED?
我在问题中说过
- WriteFile会导致 ERROR_ACCESS_DENIED如果被调用 对于未打开的文件句柄 写作(即开放) 只读)。
醇>
在为打开的标志和另一个事件添加进一步的日志记录后,结果证明这是正确的。打开标志的日志记录显示,在错误点,文件对象是用CFile :: modeRead打开的,因此我们得到了ERROR_ACCESS_DENIED。
还没有发现哪个奇怪的代码路径导致这个,但这只是表明:永远不要相信自己的代码。 : - )
(哦,顺便说一句。失败的::WriteFile
不是::FlushFileBuffers
API,但显然会返回相同的错误。)
答案 1 :(得分:1)
答案 2 :(得分:1)
有大约十几种不同的情况可能导致ERROR_ACCESS_DENIED。在内部,所有WriteFile都会调用NtWriteFile并将其(有些有意义的)NTSTATUS错误代码映射到一个不太有意义的HRESULT。
除其他外,ERROR_ACCESS_DENIED可能表示该文件位于网络卷上,并且写入权限出错,或者该文件实际上不是文件而是目录。
答案 3 :(得分:0)
如果你可以调试它,你应该。它可能是一百万件事: