【问题标题】:CreateFile in separate thread returns INVALID_HANDLE_VALUE in MFC app单独线程中的 CreateFile 在 MFC 应用程序中返回 INVALID_HANDLE_VALUE
【发布时间】:2011-10-31 14:11:34
【问题描述】:

我有一个 MFC 应用程序,它会启动一个单独的线程来通过 cURL 下载一些文件。一开始它会下载一个包含文件大小和最后写入时间的文本文件。然后它检查磁盘上的文件,如果它具有不同的值,则将其排队下载。问题是;线程中的 CreateFile 调用任意返回 INVALID_HANDLE_VALUE。我总是在 CreateFile() 成功后执行 CloseHandle()。失败的文件只是随机的。有时是根目录中的文件,有时是嵌套目录中的文件。该问题与本地化或目录/文件名无关,因为有时所有检查都通过但有时没有。 GetLastError() 有时会返回 2 或 3,分别是“找不到文件”/“找不到路径”。

当我将检查文件写入时间和大小的函数直接放入 OnInitDialog() 函数时,一切正常。这听起来像是一个多线程问题,但我仔细检查了从内存分配到文件句柄的所有内容。

相同的代码在控制台应用程序中也可以在单独的线程中运行。

平台是Win7 64bit。
静态链接到运行时和 MFC。

【问题讨论】:

  • 你使用的是绝对路径还是相对路径?也许另一个线程正在更改当前目录,导致您的相对路径无效。
  • 我不能感谢你... :) 让它成为一个答案,这样我就可以了。
  • 继续提交您自己的答案并接受它。

标签: multithreading winapi mfc createfile


【解决方案1】:

在我的情况下,GetCurrentDirectory() 在一段时间后返回了 system32 路径,因此我的代码由于凭据而失败。我通过手动确定文件路径解决了这个问题(在开始时获取 exe 路径并从那里开始使用它......)。确保您没有尝试写入/读取磁盘上的特权位置。检查你的路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多