Пример составления списка ресурсов исполняемого файла
В этом примере составляется список ресурсов файла Hand.exe, который записывается в текстовый файл Resinfo.txt.
char szBuffer[80]; // буфер печати для EnumResourceTypes
DWORD cbWritten; // кол-во байт записанных в файл
int cbString; // длина строки в sprintf
// Объявление функций обратного вызова.
BOOL EnumTypesFunc(
HANDLE hModule,
LPTSTR lpType,
LONG lParam);
BOOL EnumNamesFunc(
HANDLE hModule,
LPCTSTR lpType,
LPTSTR lpName,
LONG lParam);
BOOL EnumLangsFunc(
HANDLE hModule,
LPCTSTR lpType,
LPCTSTR lpName,
WORD wLang,
LONG lParam);
// Загрузка .EXE файла для которого нужно составить список ресурсов.
hExe = LoadLibrary("hand.exe");
if (hExe == NULL)
{
ErrorHandler("Could not load .EXE.");
}
// Создание файла содержащего ресурсную информацию.
hFile = CreateFile("resinfo.txt", // имя файла
GENERIC_READ | GENERIC_WRITE, // метод доступа
0, // способ совместного доступа
(LPSECURITY_ATTRIBUTES) NULL, // без поддержки защиты
CREATE_ALWAYS, // создание флагов
FILE_ATTRIBUTE_NORMAL, // атрибуты файла
(HANDLE) NULL); // не временный
if (hFile == INVALID_HANDLE_VALUE) {
ErrorHandler("Could not open file.");
}
// Поиск ресурсов.
cbString = sprintf(szBuffer,
"The file contains the following resources:\n\n");
WriteFile(hFile, // файл для списка ресурсов.
szBuffer, // что записать в файл
(DWORD) cbString, // кол-во байт в массиве szBuffer
&cbWritten, // кол-во записанных байт
NULL); // без перекрытия чтения/записи
EnumResourceTypes(hExe, // описатель модуля
(ENUMRESTYPEPROC)EnumTypesFunc, // функция обратного вызова
0); // дополнительный параметр
// Выгрузка исполняемого файла, чьи ресурсы были
// перечислены в созданном файле и закрытие файла
// с информацией о ресурсах.
FreeLibrary(hExe);
CloseHandle(hFile);
// ФУНКЦИЯ: EnumTypesFunc(HANDLE, LPSTR, LONG)
//
// НАЗНАЧЕНИЕ: Функция обратного вызова для
// каждого перечислимого типа ресурса
BOOL EnumTypesFunc(
HANDLE hModule, // описатель модуля
LPTSTR lpType, // тип ресурса
LONG lParam) // дополнительный параметр
{
int cbString;
// Записать тип ресурса в текстовый файл.
// Тип может быть строкой или беззнаковым целым
if ((ULONG)lpType & 0xFFFF0000)
{
cbString = sprintf(szBuffer, "Type: %s\n", lpType);
}
else
{
cbString = sprintf(szBuffer, "Type: %u\n", (USHORT)lpType);
}
WriteFile(hFile, szBuffer, (DWORD) cbString,
&cbWritten, NULL);
// Поиск всех ресурсов типа lpType.
EnumResourceNames(hModule,
lpType,
(ENUMRESNAMEPROC)EnumNamesFunc,
0);
return TRUE;
}
// ФУНКЦИЯ: EnumNamesFunc(HANDLE, LPSTR, LPSTR, LONG)
//
// НАЗНАЧЕНИЕ: Функция обратного вызова для имен ресурса
BOOL EnumNamesFunc(
HANDLE hModule, // описатель модуля
LPCTSTR lpType, // тип ресурса
LPTSTR lpName, // имя ресурса
LONG lParam) // дополнительный параметр
{
int cbString;
// Запись имени ресурса в текстовый файл.
// Имя может быть строкой или целым беззнаковым числом.
if ((ULONG)lpName & 0xFFFF0000)
{
cbString = sprintf(szBuffer, "\tName: %s\n", lpName);
}
else
{
cbString = sprintf(szBuffer, "\tName: %u\n",
(USHORT)lpName);
}
WriteFile(hFile, szBuffer, (DWORD) cbString,
&cbWritten, NULL);
// Поиск названий языков всех ресурсов типа
// lpType и имени lpName.
EnumResourceLanguages(hModule,
lpType,
lpName,
(ENUMRESLANGPROC)EnumLangsFunc,
0);
return TRUE;
}
// ФУНКЦИЯ: EnumLangsFunc(HANDLE, LPSTR, LPSTR, WORD, LONG)
//
// НАЗНАЧЕНИЕ: Функция обратного вызова для языков ресурса
BOOL EnumLangsFunc(
HANDLE hModule, // описатель модуля
LPCTSTR lpType, // тип ресурса
LPCTSTR lpName, // имя ресурса
WORD wLang, // язык ресурса
LONG lParam) // дополнительный параметр
{
HANDLE hResInfo;
char szBuffer[80];
int cbString = 0;
hResInfo = FindResourceEx(hModule, lpType, lpName, wLang);
// Запись языка ресурса в текстовый файл.
cbString = sprintf(szBuffer, "\t\tLanguage: %u\n", (USHORT)wLang);
WriteFile(hFile, szBuffer, (DWORD) cbString,
&cbWritten, NULL);
// Записывается описатель ресурса и размер буфера.
cbString = sprintf(szBuffer,
"\t\thResInfo == %lx, Size == %lu\n\n",
hResInfo,
SizeofResource(hModule, hResInfo));
WriteFile(hFile, szBuffer, (DWORD) cbString,
&cbWritten, NULL);
return TRUE;
}
