WinPro logo. Перейти на сайт www.winpro.narod.ru

Пример составления списка ресурсов исполняемого файла



В этом примере составляется список ресурсов файла 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; 
} 
Hosted by uCoz