Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2014, 14:54   #1
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
Вопрос Получить имена ресурсов иконок из PE-файла

Добрый день!

Собственно сабж. Задача вычитки всех ресурсов типа RT_ICON уже решена, получаю HICON и ResID и массив LangIDs каждого ресурса RT_ICON. Но помимо этих данных у иконки есть имя, например 'MY_ICON1". Собственно вопрос: как получить это имя?
Весь MSDN перерыл, правда только раздел "Resource Icons" и все функции, касающиеся ресурсов иконок. Но там тщетно.

Получаю обозначенные 3 параметра с помощью трехзвенки функций-перечислений EnumResourceTypes, EnumResourceNames и EnumResourceLanguages.

Ткните мордой, куда еще копать в плане получения имени ресурса? Может копать какой-то конкретный тип ресурса?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 13.02.2014, 15:03   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
EnumResourceNames
поидее она может, если идентификатор не типа это строка.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.02.2014, 15:12   #3
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

она возвращает ресурс lpszName типа PChar, который после преобразования DWORD(lpszName) дает индекс ресурса в модуле. Простое присвоение строке iriName:=lpszName дает AV.

Имеете в виду тип реурса RT_STRING? Я подразумеваю, что именем ресурса все не просто в плане наличия множества языковых локалей, собственно для чего и нужна функция EnumResourceLanguages. Т.е. строковое имя ресурса может быть на разных языках, если варианты имен были указано при сборке ресурса. А вообще имя ресурса и его ID это не одно и тоже. Или я не прав?
"ковыряю изнутри" (с)

Последний раз редактировалось Stilet; 13.02.2014 в 15:57.
3D Hunter вне форума Ответить с цитированием
Старый 13.02.2014, 15:15   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
Имеете в виду тип реурса RT_STRING?
нет, там написано что если тип передан не идентификатором готовым а строкой то он вернет строковое имя.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.02.2014, 15:17   #5
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

поясните пожалуйста, то значит строкой?
Вот код:

Код:
type
  //структура ресурса иконки
  _ICON_RES_INFO = record
    iriResID:DWORD;          //ресурсный ID иконки
    iriLangIDs:array of Word;//массив ID'ов языковых локалей
    iriName:string;          //имя ресурса иконки
    iriHIcon:HICON;          //хэндл иконки
  end;
...
//callback-функция поиска ресурсов имен иконок для функции EnumResourceLanguages
function CallBackProc_EnumIconLangs(hModule:HMODULE;
                                    lpszType:LPCTSTR;
                                    lpszName:LPCTSTR;
                                    wIDLanguage:Word;
                                    lParam:LONG_PTR):Boolean; stdcall;
begin
  Result:=True;
  with P_ICON_RES_INFO(lParam)^ do
    begin
      SetLength(iriLangIDs,Length(iriLangIDs)+1);
      iriLangIDs[High(iriLangIDs)]:=wIDLanguage;
    end;
end;

//callback-функция поиска ресурсов иконок для функции EnumResourceNames
function CallBackProc_EnumIconNames(hModule:HMODULE;
                                    lpszType:LPCTSTR;
                                    lpszName:LPTSTR;
                                    lParam:LONG_PTR):Boolean; stdcall;
var
  LFindIcon:HRSRC;
  LLoadIcon:HGLOBAL;
  LLockIcon:LPVOID;
  LpIconResInfo:P_ICON_RES_INFO;
begin
  Result:=True;

  //находим ресурс иконки
  LFindIcon:=FindResource(hModule,lpszName,lpszType);
  if (LFindIcon=INVALID_HANDLE_VALUE) then Exit;

  //загружаем ресурс иконки
  LLoadIcon:=LoadResource(hModule,LFindIcon);
  if (LLoadIcon=INVALID_HANDLE_VALUE) then Exit;

  //берем указатель на данные ресурса иконки
  LLockIcon:=LockResource(LLoadIcon);
  if (LLockIcon=nil) then Exit;

  //пытаемся извлечь хэндл иконки и ее имя в ресурсе
  New(LpIconResInfo);
  try
    with LpIconResInfo^ do
      begin
        //извлекаем ресурсовый ID иконки
        iriResID:=WORD(lpszName);

        //извлекаем ID'ы языковых локалей
        if (not EnumResourceLanguages(hModule,lpszType,lpszName,ENUMRESLANGPROC(@CallBackProc_EnumIconLangs),Integer(LpIconResInfo))) then
          Abort;

        //извлекаем ресурсное имя иконки
        iriName:=lpszName;//здесь случается AV 

        //извлекаем ресурсный хэндл иконки
        iriHIcon:=CreateIconFromResourceEx(LLockIcon,SizeofResource(hModule,LLoadIcon),True,$00030000,0,0,LR_DEFAULTCOLOR);
        if (iriHIcon=0) then
          Abort;
      end;
  except
    on E:Exception do
      begin
        ShowMessage(E.Message);
        Dispose(LpIconResInfo);
        Exit;
      end;
  end;

  //добавили хэндл иконки в список
  TList(lParam).Add(LpIconResInfo);
end;

//заполняет список AList иконками, извлеченными из файла AFileName (если удалось, то true)
function EnumIcons(const AFileName:string;
                   const AList:TList):Boolean;
var
  LModule:HMODULE;
begin
  Result:=False;

  //загружаем модуль как набор данных
  LModule:=LoadLibraryEx(PChar(AFileName),0,LOAD_LIBRARY_AS_DATAFILE);
  if (LModule=INVALID_HANDLE_VALUE) then Exit;

  //ищем все иконки в модуле и помещаем в список
  try
    if (not EnumResourceNames(LModule,RT_ICON,ENUMRESNAMEPROC(@CallBackProc_EnumIconNames),Integer(AList))) then Exit;
    Result:=True;
  finally
    FreeLibrary(LModule);
  end;
end;
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 13.02.2014, 15:54   #6
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Понимаю, что нужно вместо lpszName = PChar(Integer) подставить символ # в имя, чтобы возвращалось имя... Ситуация в том, что я не знаю имен ресурсов иконок. Поэтому делаю перечисление. Индексы ресурсов я получил. Как теперь извлечь имена этих же ресурсов?
Например, когда мы пишем rc-файл для компиляции ресурса, обычно делаем так:
Код:
MY_ICON1 ICON "C:\icon1.ico"
В данном случае "MY_ICON1" - это и есть имя ресурса. Его и нужно получить.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 14.02.2014, 08:51   #7
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Неужели никто не сталкивался с этим вопросом?
Почему ResHacker видит имена ресурсов иконок? Откуда он их берет?
1.png
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 14.02.2014, 10:28   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
If IS_INTRESOURCE(lpszType) is TRUE, then lpszType specifies the integer identifier of the given resource type. Otherwise, it is a pointer to a null-terminated string. If the first character of the string is a pound sign (#), then the remaining characters represent a decimal number that specifies the integer identifier of the resource type. For example, the string "#258" represents the identifier 258.
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.02.2014, 10:42   #9
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Я читал этот кусок раз 30 наверно точно. Можно на строчке кода вызова функции показать? Я уже проверял, нет разницы между RT_ICON и '#3' в параметре lpszType. Тогда в чем разница?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 14.02.2014, 10:53   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
Тогда в чем разница?
Разницу между 3 и "3" понимаете? Первое это число, второе это строка текста.

Код:
if (IS_INTRESOURCE(lpName))
   LPCTSTR name = itoa((int) lpName);
else
   LPCTSTR name = lpName;
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить имена физических дисков. Ant-kul C# (си шарп) 2 16.12.2012 15:08
Получить имена всех листов в книге Temnota Microsoft Office Excel 6 26.12.2009 07:36
Получить список ресурсов и сохранить их отдельно Alex Cones Общие вопросы Delphi 16 14.11.2009 13:45
Получить HWND рабочего стола без иконок Son Win Api 4 24.06.2009 15:57
Получить доменные имена lamerx Работа с сетью в Delphi 1 10.10.2008 16:57