Типы ресурсов мы получили, но для доступа к самим ресурсам нам нужно получить их имена. Вот для этого и существует функция EnumResourceNames():
BOOL EnumResourceNames ( HMODULE hModule, // модуль LPCTSTR lpszType, // тип ресурса ENUMRESNAMEPROC 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); BOOL WINAPI EnumNamesFunc(HMODULE hModule, LPCTSTR lpType,LPTSTR lpName,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; EnumResourceNames(hModule,lpType,(ENUMRESNAMEPROC)EnumNamesFunc,0); return true; } BOOL WINAPI EnumNamesFunc(HMODULE hModule, LPCTSTR lpType,LPTSTR lpName,LONG lParam) { char buffer[100]; if ((ULONG)lpName & 0xFFFF0000) { sprintf(buffer,"%s\n", lpName); } else { sprintf(buffer, "%u\n",(USHORT)lpName); } cout << "Name Res " << buffer << endl; return true; }
Пример результата ее работы:
........ Type 9 Name Res1 Name Res2 Type 14 Name Res1 Name Res2 Type 16 Name Res1
Кстати к ресурсам можно обращаться как по именам, так и по идентификаторам. Вот теперь мы получили имена ресурсов и их типы. Можно извлекать их из модуля. По этому поводу есть функции, например, LoadImage(), LoadIcon(), LoadMenu(), LoadCursor() ну и так далее.