WriteFIle зависает

0

Моя программа зависает в следующей строке, когда она запускается из удаленного каталога.

::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
    Является ли resource_data действительным HGLOBAL ? Каково возвращаемое значение LockResource ? Является ли dst действительной HANDLE ? Чтобы улучшить ответ, вы можете предоставить SSCCE, который выявляет проблему.
  • 0
    Да, resource_data , dst и возвращаемое значение LockResource() действительны. Я сделаю SSCCE через час или два.
Показать ещё 4 комментария
Теги:
file-io
winapi

1 ответ

0
Лучший ответ

Похоже, что это "оптимизация" окон. Система запускает процесс и не загружает ресурсы немедленно. Когда WriteFile пытается получить доступ к ресурсу, система приостанавливает поток и считывает данный ресурс в память, но исполняемый файл находится на удаленном компьютере, и загрузка ресурса занимает очень много времени, потому что мой ресурс имеет около 180MiB.

Спасибо всем, кто пытался решить мою проблему.

  • 0
    Это называется пейджингом по требованию и является стандартным для всех современных операционных систем.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню