我的程序冻结下一个字符串,当它从远程目录运行时。
::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;
}
答案 0 :(得分:0)
这似乎是Windows的“优化”。系统启动进程并且不会立即加载资源。当WriteFile
尝试访问资源时,系统暂停线程并将给定资源读入内存,但可执行文件位于远程计算机上,资源下载需要很长时间,因为我的资源接近180MiB。
感谢所有试图解决我问题的人。