Извлечение имен ресурсов 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() ну и так далее.

 
« Предыдущая статья   Следующая статья »