Моя программа зависает в следующей строке, когда она запускается из удаленного каталога.
::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;
}
Похоже, что это "оптимизация" окон. Система запускает процесс и не загружает ресурсы немедленно. Когда WriteFile
пытается получить доступ к ресурсу, система приостанавливает поток и считывает данный ресурс в память, но исполняемый файл находится на удаленном компьютере, и загрузка ресурса занимает очень много времени, потому что мой ресурс имеет около 180MiB.
Спасибо всем, кто пытался решить мою проблему.
resource_data
действительнымHGLOBAL
? Каково возвращаемое значениеLockResource
? Является лиdst
действительнойHANDLE
? Чтобы улучшить ответ, вы можете предоставить SSCCE, который выявляет проблему.resource_data
,dst
и возвращаемое значениеLockResource()
действительны. Я сделаю SSCCE через час или два.