WinAPI C ++, как загрузить ресурсы из 64-битного приложения - PullRequest
0 голосов
/ 06 января 2020

Я хочу загрузить ресурсы из EXE. Например, я хочу загрузить информацию о версии RT_VERSION из EXE path

Обычно я делаю так

HMODULE lib = LoadLibrary(path);

HRSRC resVersion = FindResource(lib, MAKEINTRESOURCE(1), RT_VERSION);
DWORD resVersionSize = SizeofResource(lib, resVersion);
HGLOBAL resVersionLoad = LoadResource(lib, resVersion);
LPVOID resVersionData = LockResource(lib);

Но когда exe из path является выигрышным 64, LoadLibrary завершается неудачно с ERROR_BAD_EXE_FORMAT : %1 is not a valid Win32 application. Есть ли способ загрузить ресурсы из приложения win-64?

1 Ответ

1 голос
/ 06 января 2020

Windows позволяет загружать в процесс только модули одинаковой битности. Когда вы звоните LoadLibrary, система предполагает, что вы будете использовать этот модуль, и выполняет обычную инициализацию. Чтобы предотвратить это, вам нужно вместо этого вызвать LoadLibraryEx , передав флаг LOAD_LIBRARY_AS_IMAGE_RESOURCE:

Если используется это значение, система отображает файл в виртуальное адресное пространство процесса как файл изображения. Однако загрузчик не загружает stati c import и не выполняет другие обычные шаги инициализации. Используйте этот флаг, если вы хотите загрузить DLL только для извлечения из нее сообщений или ресурсов.

Если приложение не зависит от файла, имеющего макет изображения в памяти, это значение следует использовать с LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE или LOAD_LIBRARY_AS_DATAFILE. Для получения дополнительной информации см. Раздел «Примечания».

...