Извлечение имен ресурсов EnumResourceNames()

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