WriteFIle冻结

时间:2013-11-22 12:33:52

标签: c++ winapi file-io

我的程序冻结下一个字符串,当它从远程目录运行时。

::WriteFile(dst, ::LockResource(resource_data), resource_size, &written_size, NULL);

所有参数都是正确的,输出文件位于%TEMP%中。 看起来安全策略拒绝写入文件,但系统没有显示任何关于此的通知。

如果程序从本地目录运行,则相同的代码可以正常工作。

我在MSDN上找不到有关此案例的信息。

UPD:SSCCE。

bool ExtractResourceTo(const std::wstring& filename) {
  CHandle file(::CreateFile(filename.c_str(), GENERIC_WRITE, 0, 0,
                            CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  if (INVALID_HANDLE_VALUE == file) {
    LOG("Cannot create file.");
    return false;
  }
  const HINSTANCE instance = _AtlBaseModule.GetModuleINstance();
  HRSRC resource = ::FindResource(instance, kResourceName,
                                  RT_RCDATA);
  if (resource) {
    HGLOBAL resource_data = ::LoadResource(instance, resource);
    DWORD resource_size = ::SizeofResource(instance, resource);
    if (resource_data && resource_size > 0) {
      DWORD written_size;
      LPVOID resource_ptr = ::LockResource(resource_data);
      if (!resource_ptr) {
        LOG("Cannot lock resource.");
        return false;
      }
      ::WriteFile(file, resource_ptr, resource_size,
                  &written_size, NULL);
      if (written_size == resource_size) {
        return true;
      }
      LOG("Write failed.");
    }
  }
  return false;
}

1 个答案:

答案 0 :(得分:0)

这似乎是Windows的“优化”。系统启动进程并且不会立即加载资源。当WriteFile尝试访问资源时,系统暂停线程并将给定资源读入内存,但可执行文件位于远程计算机上,资源下载需要很长时间,因为我的资源接近180MiB。

感谢所有试图解决我问题的人。