当前,我们面临调用WriteFile(或者更确切地说是CFile::Write-但这只是内部调用WriteFile)而导致Win32错误5 ERROR_ACCESS_DENIED的问题。
(编辑:请注意,我们无法复制该行为。此刻,我们所拥有的只是一个日志文件,该日志文件指示CFile::Write所在的源行,并且包含错​​误ERROR_ACCESS_DENIED!)
(编辑:该文件位于本地驱动器上,实际上是文件而不是目录。)
现在,WriteFiles's documentation并没有真正的帮助,尝试使用一个简单的测试应用程序会产生以下结果:

如果为未打开的文件句柄(即仅用于读取而打开)的文件句柄被调用,

  • WriteFile将导致ERROR_ACCESS_DENIED。
  • 如果发生以下情况,它将而不是引起ERROR_ACCESS_DENIED
  • 句柄无效或文件根本没有打开
  • 在文件已被进程打开之后,将修改文件的访问权限或文件的写保护标志。 (如果在打开文件之前对它们进行了修改,则我们将永远无法进入WriteFile,因为打开文件将失败。)
  • 文件以某种方式被另一个进程/句柄锁定(这最多会导致32错误ERROR_SHARING_VIOLATION错误)。


  • 这使我们处于这种情况,这显然是如果文件实际上是使用读取标志而不是写入标志打开的,则此调用失败的唯一可能性。但是,从我们的代码来看,这似乎极不可能。 (由于进行了跟踪,因此可以确定WriteFile失败,并且可以确定错误是ERROR_ACCESS_DENIED,我们不能确定打开标志的100.1%,因为这些标志没有被找出。)
    还有其他已知情况下WriteFile(CFile::Write)会导致ERROR_ACCESS_DENIED吗?
    注意:要进一步阐明此问题的上下文,请执行以下操作:
  • 该文件已打开,因此不能是目录或诸如此类的
  • 我执行的所有测试均表明,在打开文件时无法将其删除,因此在调用WriteFile时仍应存在该文件。
  • 该文件位于本地驱动器上,而不位于网络驱动器上。

  • 我应该补充一点,我们正在Windows XP sp3上运行,并且该应用程序是使用Visual Studio 2005编译的。

    最佳答案

    问题是



    我在问题中说



    在为打开标志和其他事件添加了进一步的日志记录之后,事实证明这是正确的。打开标志的日志记录显示在错误点,文件对象是使用CFile::modeRead打开的,因此我们得到了ERROR_ACCESS_DENIED。

    尚未找到哪个奇怪的代码路径导致了这一点,但这仅表明:永远不要相信自己的代码。 :-)

    (哦,顺便说一句。不是::WriteFile失败了,而是::FlushFileBuffers API,但显然返回了相同的错误。)

    关于c++ - 是什么导致WriteFile返回ERROR_ACCESS_DENIED?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4312568/

    10-12 00:50