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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2014, 16:53   #21
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Вот ресурсовый dll-файл:
resource.rar
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 16.02.2014, 16:22   #22
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ну как я и думал - у RT_ICON имен нет, у RT_GROUP_ICON имена...
waleri вне форума Ответить с цитированием
Старый 16.02.2014, 22:23   #23
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Поясните пожалуйста. Можно кусок кода, поясняющий суть?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 17.02.2014, 11:12   #24
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Есть два вида ресурсов - RT_ICON и RT_GROUP_ICON.
Вы смотрите на RT_ICON - там имен нет.
См. сообщение #20
waleri вне форума Ответить с цитированием
Старый 19.02.2014, 11:39   #25
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

waleri, огромное спасибо! Точно заработало! Правда не представляю откуда вообще берется данная информация. Я основывался на статье по этой ссылке: resources.
И тогда возникает вопрос: как правильно соотнести индекс ресурса иконки RT_ICON с именем этого ресурса RT_GROUP_ICON? Фактически, я вынужден теперь вызывать дважды
Код:
EnumResourceNames(LModule,RT_GROUP_ICON,ENUMRESNAMEPROC(@CallBackProc_EnumIconNames),Integer(AList)));

и

EnumResourceNames(LModule,RT_ICON,ENUMRESNAMEPROC(@CallBackProc_EnumIconNames),Integer(AList)))
Подскажете, как поступить в данной ситуации?
"ковыряю изнутри" (с)

Последний раз редактировалось 3D Hunter; 19.02.2014 в 11:41.
3D Hunter вне форума Ответить с цитированием
Старый 19.02.2014, 12:18   #26
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Каждая запись в RT_GROUP_ICON содержит ID из RT_ICON.
Ref:
http://msdn.microsoft.com/en-us/library/ms997538.aspx
waleri вне форума Ответить с цитированием
Старый 19.02.2014, 12:59   #27
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Все, разобрался! Получилось. Спасибо огромное за помощь!
И последний вопрос по этой теме, скорее символичный. А может и нет. У перечисления имен ресурсов есть функция перечисления языковых локалей (LangIDs). Вопрос: изъятые таким образом имена ресурсов иконок могут иметь имена на других языках? По какому критерию извлекается юникод-строка с именем ресурса? Используется ли языковая локаль ресурса?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 19.02.2014, 14:39   #28
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Юникод строка с именем извлекается по критерию "тип" ресурса. Далее для ресурса этого типа и с этим именем есть вариации языков.
Каждый ресурс идентифицируется по типу, имени и языку, другое дело, что при работе с ресурсами языком мы обычно не занимаемся, т.е. мы принимаем, что все ресурсы с одним типом и именем это один и тот же ресурс.
waleri вне форума Ответить с цитированием
Старый 20.02.2014, 11:04   #29
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

И возник снов вопрос: при попытке считывания shell32.dll на 17й иконке выдает ошибку доступа к памяти, а точнее ее lpszName=0 вместо ожидаемого 17. И все последующие хэндлы иконок RT_ICON равны нулю тоже.
Вот код:
Код:
  //структура RT_GROUP_ICON
  //http://blogs.msdn.com/b/oldnewthing/archive/2012/07/20/10331787.aspx
  GRPICONDIR = packed record
    idReserved:Word;//зарезервировано, всегда 0
    idType:Word;    //тип образа: 1 - иконка, 0 - курсор
    idCount:Word;   //число иконок типа RT_ICON
  end;
  PGRPICONDIR = ^GRPICONDIR;

  //структура RT_ICON
  //http://blogs.msdn.com/b/oldnewthing/archive/2012/07/20/10331787.aspx
  GRPICONDIRENTRY = packed record
    bWidth:Byte;       //ширина иконки в пикселях (если больше 255, то 0)
    bHeight:Byte;      //высота иконки в пикселях (если больше 255, то 0)
    bColorCount:Byte;  //число цветов (если больше 255, то 0)
    bReserved:Byte;    //зарезервировано, всегда 0
    wPlanes:Word;      //?
    wBitCount:Word;    //глубина цвета, в битах
    dwBytesInRes:DWORD;//размер в байтах битового образа иконки
    nId:Word;          //ID ресурса иконки
  end;
  PGRPICONDIRENTRY = ^GRPICONDIRENTRY;
...
//callback-функция поиска ресурсов иконок для функции EnumResourceNames
function _EnumResNameProc(hModule:HMODULE;
                          lpszType:LPCTSTR;
                          lpszName:LPTSTR;
                          lParam:LONG_PTR):Boolean; stdcall;
var
  LFindGroupIcon,LFindIcon:HRSRC;
  LLoadGroupIcon,LLoadIcon:HGLOBAL;
  LpLockGroupIcon,LpLockIcon:LPVOID;
  i,LIconCount:Word;
  LResName:string;
  LHIcon:HICON;
begin
  Result:=True;

  //извлекаем имя ресурса иконки
  try
    if (HiWord(DWORD(lpszName))<>0) then
      LResName:=lpszName
    else
      LResName:=IntToStr(LOWORD(lpszName));
  except
    LResName:='<unknown>';
  end;

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

  //загружаем ресурс групповой иконки
  LLoadGroupIcon:=LoadResource(hModule,LFindGroupIcon);
  if (LLoadGroupIcon=INVALID_HANDLE_VALUE) then Exit;

  //берем указатель на данные ресурса групповой иконки
  LpLockGroupIcon:=LockResource(LLoadGroupIcon);
  if (LpLockGroupIcon=nil) then Exit;

  //узнаем число иконок и сдвигаем указатель на первую структуру RT_ICON
  LIconCount:=PGRPICONDIR(LpLockGroupIcon)^.idCount;
  LpLockGroupIcon:=LPVOID(DWORD(LpLockGroupIcon)+SizeOf(GRPICONDIR));

  //извлекаем ресурсы иконок
  for i:=1 to LIconCount do
    with PGRPICONDIRENTRY(LpLockGroupIcon)^ do
      try
        //находим ресурс иконки
        LFindIcon:=FindResource(hModule,MakeIntResource(nId),RT_ICON);
        if (LFindIcon=INVALID_HANDLE_VALUE) then Continue;

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

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

        //извлекаем ресурсный хэндл иконки
        LHIcon:=CreateIconFromResourceEx(LpLockIcon,SizeofResource(hModule,LLoadIcon),True,$00030000,0,0,LR_DEFAULTCOLOR);
        if (LHIcon=0) then Continue;

        //создали и добавили структуру в список
        TObjectList(lParam).Add(TIconResource.Create(nId,LResName,LHIcon));
      finally
        //взяли указатель на следующую структуру RT_ICON
        LpLockGroupIcon:=LPVOID(DWORD(LpLockGroupIcon)+SizeOf(GRPICONDIRENTRY));
      end;
end;
Может я неверно хожу по структурам по указателям?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 21.02.2014, 08:58   #30
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Копаю уже второй день и ничего не накопал. Вот вроде же все верно построено в коде. На мелких ресурсных модулях работает нормально, а на "эталонном" shell32.dll отказывается. В чем может быть особенность? Почему после 16го индекса ресурса RT_GROUP_ICON сразу идет ресурс с индексом #0, а после него уже 17, 18...и до конца, но после нуля все хендлы иконок RT_ICON, возвращаемых методом
Код:
CreateIconFromResourceEx(LpLockIcon,SizeofResource(hModule,LLoadIcon),True,$00030000,0,0,LR_DEFAULTCOLOR);
поголовно равны нулю.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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