Как известно, в программах хранятся их ресурсы. Как извлечь ресурсы из файла EXE или DLL программным путем ??? Очень просто. В WIN32 API предусмотрены специальные функции по этому поводу. Давайте посмотрим EnumResourceTypes(), которая позволяет узнать все типы ресурсов, которые есть в модуле:
BOOL EnumResourceTypes ( HMODULE hModule, // указатель на модуль ENUMRESTYPEPROC lpEnumFunc, // функция перечисления LONG_PTR lParam // параметры определенные программистом );
Как ее применить. Ну, во-первых нужно получить указатель на модуль, потом вызвать эту функцию, передав в параметрах и модуль и функцию, которая будет вызываться. Вот так:
// ResTest.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "windows.h" #include "iostream.h" BOOL WINAPI EnumTypesFunc(HMODULE hModule,LPTSTR lpType, LONG lParam); void main() { HMODULE hMod=NULL; hMod = LoadLibrary("notepad.exe"); if (hMod != NULL) { EnumResourceTypes(hMod,(ENUMRESTYPEPROC)EnumTypesFunc,0); FreeLibrary(hMod); } else cout << "Not Load Module"; } BOOL WINAPI EnumTypesFunc(HMODULE hModule,LPTSTR lpType, LONG lParam) { char buffer[100]; if ((ULONG)lpType & 0xFFFF0000) { sprintf(buffer, "%s\n", lpType); } else { sprintf(buffer, "%u\n", (USHORT)lpType); } cout << "Type " << buffer << endl; return true; }
В чем смысл этой функции ??? Идея в том, что Windows сама будет искать типы ресурсов, и, как только найдет очередной тип, сразу вызовет эту функцию. Так как эта функция будет вызываться Windows тип вызова у нее WINAPI. Это очень удобно, так как нас не интересует внутренняя организация ресурсов. Пусть об этом думает Windows, нам типы подавай.