Друзья! Вот, допустим, мне нужны имена ресурсов экзешника, я использую эту функцию и она возвращает мне их числовые тык скыть идентификаторы: http://msdn.microsoft.com/en-us/library/windows/desktop/ms648034(v=vs.85).aspxА вот если чё код, вот тут ищутся имена типов ресурсов, имена ресурсов и имена языка ресурсов. Код (Text): #include <windows.h> #include <stdio.h> // Объявление функций повторного вызова. 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); int main () { SetConsoleCP (1251); SetConsoleOutputCP (1251); HANDLE hExe = LoadLibrary("notepad.exe"); EnumResourceTypes((HMODULE)hExe,(ENUMRESTYPEPROC)EnumTypesFunc, 0); FreeLibrary((HMODULE)hExe); getchar (); } // ФУНКЦИЯ: EnumTypesFunc(HANDLE, LPSTR, LONG) // ПРЕДНАЗНАЧЕНИЕ: Повторный вызов типа ресурса BOOL EnumTypesFunc(HANDLE hModule, LPTSTR lpType, LONG lParam) { //if ((ULONG)lpType & 0xFFFF0000){ if (!(IS_INTRESOURCE(lpType))) printf("Имя типа строчное %s\n", lpType); else printf("Имя типа в виде числа %d\n", lpType); EnumResourceNames((HMODULE)hModule, lpType, (ENUMRESNAMEPROC)EnumNamesFunc, 0); return TRUE; } // ФУНКЦИЯ: EnumNamesFunc(HANDLE, LPSTR, LPSTR, LONG) // ПРЕДНАЗНАЧЕНИЕ: повторный вызов имени ресурса BOOL EnumNamesFunc(HANDLE hModule, LPCTSTR lpType, LPTSTR lpName, LONG lParam) { //if ((ULONG)lpType & 0xFFFF0000){ if (!(IS_INTRESOURCE(lpType))) printf("Имя ресурса строчное %s\n", lpName); else printf("Имя ресурса в виде числа %d\n", lpName); // Найдем языки всех ресурсов типа lpType и имени lpName. EnumResourceLanguages((HMODULE)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) { //if ((ULONG)lpType & 0xFFFF0000){ if (!(IS_INTRESOURCE(lpType))) printf("Имя языка в виде числа %s\n", wLang); else printf("Имя языка в виде числа %d\n\n", wLang); return TRUE; } Как-то так уж получилось что для первого и последнего задания есть помощь, для первого это куча макросров http://msdn.microsoft.com/en-us/library/windows/desktop/ms648009(v=vs.85).aspx для последнего какой-то MAKELANGID непонятный, ещё не разбирался А как узнать имя ресурса по его числу, получается у меня нет шанса вообще, так? Спасибо, кто откликнется!
нет никагого "имени по числу". ресурс может иметь либо целочисленный идентификатор, либо строковый. но не оба сразу.
Допустим, тип имеет числовой идентификатор. Чтобы узнать что из себя представляет этот тип (не строковое представление, а просто что он такое- икона или ещё что) я обращусь к этой таблице: http://msdn.microsoft.com/en-us/library/windows/desktop/ms648009(v=vs.85).aspx (это я и называю "узнать имя по числу" и сдаётся мне, вы поняли, о чём речь ) Вот как мне сделать нечто подобное с числовым идентификаторо имени ресурса?
Если бы всё было так просто, я бы этим ограничился, но, майкрософтцы предлагают определять имя ресурса, пользуясь таблицей имён типов http://msdn.microsoft.com/en-us/library/windows/desktop/ms648034(v=vs.85).aspx "lpszName [in] Type: LPTSTR The name of a resource of the type being enumerated. Alternately, rather than a pointer, this parameter can be MAKEINTRESOURCE(ID), where ID is the integer identifier of the resource. For more information, see the Remarks section below. " Имя типа есть имя ресурса что ли?
MAKEINTRESOURCE(RT_VERSION); RT_VERSION это именованная константа RT_VERSION = 16 При возведенном 31 бите в имени, это строковое имя (RVA указатель на UNICODE строку, имя\тип ресурса), иначе это числовое значение ресурса. Список стандартных типов ресурсов приведен на сайте ms. Можно создавать и свои (именованные\числовые). Или я вопроса не понял? Код (Text): void ResourceKit::GetResourceType(DWORD Num) { int i; short int WStringLen; GetResourceType_Result.iName = *(PDWORD) &VirtualFile[PE.ResourceTable+sizeof(ResourceDirectory)+sizeof(struct _ResourceDirectoryEntry)*Num]; /* Используется указатель на UNICODE тип ресурса */ if(NameBitUnset(&GetResourceType_Result.iName) == 1) { WStringLen = *(PWORD) &VirtualFile[PE.ResourceTable+GetResourceType_Result.iName]; for(i=0;i<WStringLen;i++) cResourceType_tmp[i] = VirtualFile[PE.ResourceTable+GetResourceType_Result.iName+2+i*2]; cResourceType_tmp[WStringLen] = 0x0000; // Нультирминированая строка GetResourceType_Result.cName = &cResourceType_tmp[0]; NameBitSet(&GetResourceType_Result.iName); } else GetResourceType_Result.cName = NULL; }
С типами понятно. Если бы всё было так просто, я бы этим ограничился, но, майкрософтцы предлагают определять имя ресурса, пользуясь таблицей имён типов "lpszName [in] Type: LPTSTR The name of a resource of the type being enumerated. Alternately, rather than a pointer, this parameter can be MAKEINTRESOURCE(ID), where ID is the integer identifier of the resource. For more information, see the Remarks section below. " Имя типа есть имя ресурса что ли?
Ресурсы это дерево, с вложенностью до 2^31, но практически используется только три уровня: Главная директория: Типы ресурсов: Имя ресурса Язык ресурса Каждая директория описывается одной структурой, после которой идут вторые типы структур. Стандартные типы ресурсов RT_ICON RT_VERSION RT_BITMAP это числовое представление типов. Код (Text): typedef struct _ResourceDirectory { DWORD Flags; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; WORD NumOfNameEntry; WORD NumOfIdEntry; } ResourceDirectory, *pResourceDirectory; typedef struct _ResourceDirectoryEntry { DWORD Name; DWORD OffsetToData; } ResourceDirectoryEntry, *pResourceDirectoryEntry; typedef struct _ResourceDataEntry { DWORD OffsetToData; DWORD Size; DWORD CodePage; DWORD Reserved; } ResourceDataEntry, *pResourceDataEntry;
Русским по белому написано "Alternately, rather than a pointer, this parameter can be MAKEINTRESOURCE(ID), where ID is the integer identifier of the resource." То есть, ресурс может иметь имя в виде строки, а может и нихрена не иметь имени, а вовсе даже просто числовой ID. Ето зависит только от фантазии программиста: захочет он - даст ресурсу имя, не захочет - будет у ресурса числовой ID.