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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2014, 02:48   #1
Сидоров
Пользователь
 
Аватар для Сидоров
 
Регистрация: 01.07.2014
Сообщений: 11
По умолчанию ExtractIcon видит только одну иконку

Все привет ! Столкнулся с такой проблемой API функция
Код:
ExtractIcon (HINSTANCE, 'c:\project1.exe',0)
Видит только нулевую (основную ) иконку хоть и заранее известно что их больше.Приложение

'c:\project1.exe' это Lazarus приложение с которого я пытаюсь прочитать
иконку.Вообще как получить свою иконку,я знаю
Код:
Image1.Picture.Icon.Handle := LoadImage(HINSTANCE, MAKEINTRESOURCE('MAINICON'), IMAGE_ICON, 128, 128, LR_LOADTRANSPARENT);
,но речь идет о посторонних приложениях из которых мне нужно получить иконки 64Х64 (если они есть конечно у приложения).

msdn говорит что функция "ExtractIcon" возвращает количество иконок если 3-тий параметр равен -1 ,но она возвращает 0 постоянно .

цитата из msdn

Цитата:
If this value is -1, the function returns the total number of icons in the specified file. If the file is an executable file or DLL,
the return value is the number of RT_GROUP_ICON resources. If the file is an .ICO file, the return value is 1.

If this value is a negative number not equal to –1, the function returns a handle to the icon in the specified file whose resource
identifier is equal to the absolute value of nIconIndex. For example, you should use –3 to extract the icon whose resource identifier
is 3. To extract the icon whose resource identifier is 1, use the ExtractIconEx function.
Так как же прочитать большие иконки?

Последний раз редактировалось Stilet; 15.10.2014 в 07:32.
Сидоров вне форума Ответить с цитированием
Старый 15.10.2014, 07:34   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

ExtractIconEx() не пробовал?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.10.2014, 11:44   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

ExtractIcon видит все иконки - последний аргумент может быть индексом.
Вы задали 0, что извлекает первую иконку.
Задайте 1, извлечет вторую и так далее.
Если всегда возвращает 0, тогда стоит глянуть на ЕХЕ файл редактором ресурсов.
На худой конец можно всегда загрузить ресурсы напрямую. EnumResourceNames, FindResource и далее.

Ну или воспользоваться ExtractIconEx

Последний раз редактировалось waleri; 15.10.2014 в 11:48.
waleri вне форума Ответить с цитированием
Старый 15.10.2014, 13:52   #4
Сидоров
Пользователь
 
Аватар для Сидоров
 
Регистрация: 01.07.2014
Сообщений: 11
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
ExtractIcon видит все иконки - последний аргумент может быть индексом.
Вы задали 0, что извлекает первую иконку.
Задайте 1, извлечет вторую и так далее.
Если всегда возвращает 0, тогда стоит глянуть на ЕХЕ файл редактором ресурсов.
На худой конец можно всегда загрузить ресурсы напрямую. EnumResourceNames, FindResource и далее.

Ну или воспользоваться ExtractIconEx

ExtractIconEx Читал о ней пробовал те же яйца только в профиль .
Я ExtractIcon в качестве 3 параметра - 1 указываю в программе ,что бы узнать сколько у меня иконок есть.

Код:
var
  IconCounter:integer;
  FileIcon:TIcon;
begin
  FileIcon:=TIcon.Create;

  IconCounter:= ExtractIcon(HINSTANCE,'c:\project1.exe',-1) ;

  if   IconCount > 0 then
  FileIcon.Handle:=  ExtractIcon(HINSTANCE,'c:\project1.exe', IconCount);
end;
А вот "FindResource" попробывать можно ))
Сидоров вне форума Ответить с цитированием
Старый 15.10.2014, 14:18   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

ПОчему первый вызов IconCounter а второй с IconCount?
Далее, даже если одна переменная, последняя икона будет IconCount-1 - индексы начинаются с 0
waleri вне форума Ответить с цитированием
Старый 15.10.2014, 14:34   #6
Сидоров
Пользователь
 
Аватар для Сидоров
 
Регистрация: 01.07.2014
Сообщений: 11
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
ПОчему первый вызов IconCounter а второй с IconCount?
Далее, даже если одна переменная, последняя икона будет IconCount-1 - индексы начинаются с 0
Код:
var
  IconCounter:integer;
  FileIcon:TIcon;
begin
  FileIcon:=TIcon.Create;
   //проверяет сколько иконок есть
  IconCounter:= ExtractIcon(HINSTANCE,'c:\project1.exe',-1) ;

FileIcon.Handle:=  ExtractIcon(HINSTANCE,
'c:\project1.exe', IconCounter);
Image1.Picture.Icon:=FileIcon;
end;
Тоже самое . Индексы начинаются с нуля,верно по этому
Код:
ExtractIcon(HINSTANCE,'c:\project1.exe',0)
содержит иконку ,а
Код:
ExtractIcon(HINSTANCE,'c:\project1.exe',1)  или 2
нет

Последний раз редактировалось Сидоров; 15.10.2014 в 14:43.
Сидоров вне форума Ответить с цитированием
Старый 15.10.2014, 14:55   #7
Сидоров
Пользователь
 
Аватар для Сидоров
 
Регистрация: 01.07.2014
Сообщений: 11
По умолчанию

Вообще по идеи и так должно работать
Код:
var
   Icon: TIcon;
   FileInfo: SHFILEINFO;
 begin
   Icon := TIcon.Create;
   try
     // Get the Icon 
    SHGetFileInfo(PChar('Filename.exe'), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON);
     icon.Handle := FileInfo.hIcon;

     DestroyIcon(FileInfo.hIcon);
     // Save the Icon to a file: 
    icon.SaveToFile('IconFromExe.ico');
     // Set the Icon as Application Icon (temporary) 
    Application.Icon := icon;

   finally
     Icon.Free;
   end;
 end;
Но если последний параметр равен "SHGFI_ICON" то иконки маленкие,а если "SHGFI_LARGEICON" их вообще нет. http://msdn.microsoft.com/en-us/library/aa931527.aspx
Сидоров вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Комп видит только себя Kazik Компьютерное железо 6 07.05.2013 08:23
Выделить только одну цифру dx2001 Microsoft Office Excel 6 30.05.2011 17:42
Возвращает только одну запись.... Cartman18 БД в Delphi 5 15.09.2010 16:53
Добавить только одну строчку, а не все hozey Общие вопросы Delphi 3 14.05.2010 18:12
passthru выводит только одну строку motorway PHP 5 07.07.2009 21:27