Типы ресурсов мы получили, но для доступа к самим ресурсам нам нужно получить их имена. Вот для этого и существует функция 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() ну и так далее.