Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как заменить иконку? [D6, WinXP]


Страницы:   1 2 3

Artem ©   (2008-01-23 22:01:00) 

Коллеги, помогите решить следующую задачу.

В моей программе в файле ресурсов (library.res) находится иконка. Компилировался он следующим образом:

i1 RT_ICON i1.ico

Вопрос в следующем: как заменить иконку другого приложения на ту, что находится в моей программе в файле ресурсов ("i1")?

Нашел процедуру и подправил ее под свои задачи, но не получается. В чем ошибка? Код такой:

procedure Changeicon(const EXEFileName:string;ResName:PChar);
var
 hExe, hResLoad, hUpdateRes, hRes: THandle;
 lpResLock: PChar;
 result: Boolean;
 S, SS: String;

begin

S:=paramstr(0);

hExe:=LoadLibrary(PChar(S));    
 if (hExe=0) then ShowMessage('Could not load exe.');

 hRes:=FindResource(hExe, Pchar(ResName), RT_ICON);  
 if (hRes=0) then ShowMessage('Could not locate resource.');

 hResLoad:=LoadResource(hExe, hRes);
 if (hResLoad=0) then ShowMessage('Could not load icon.');

 lpResLock:=LockResource(hRes);    
 if (lpResLock=nil) then ShowMessage('Could not lock icon.');

 SS:=EXEFileName;
 hUpdateRes:=BeginUpdateResource(PChar(SS), TRUE);
 if (hUpdateRes=0) then ShowMessage('Could not open file for writing.');

 result:=UpdateResource(hUpdateRes,      // update resource handle
           RT_ICON,                  // change dialog box resource
           PChar(1),                  // icon name
           LANG_NEUTRAL,
           lpResLock,                  // ptr to resource info
           SizeofResource(hExe, hRes)); // size of resource info.
 if result=False then ShowMessage('Could not add resource.');

 EndUpdateResource(hUpdateRes, FALSE);

 FreeLibrary(hExe);

end;


Использую процедуру так:
ChangeIcon('c:\program.exe',Pchar('i1'));

Ошибка начинается с
hExe:=LoadLibrary(PChar(S));    
 if (hExe=0) then ShowMessage('Could not load exe.');


Нужна Ваша помощь. Заранее благодарю участников дискуссии.


Сергей М.   (2008-01-24 12:42:00) [1]

Вот тебе еще в помощь:

http://forum.vingrad.ru/forum/topic-182172.html

И не пытайсяслепо передирать чужой код - анализируй, думай, принимай решения по его адаптации к твоейзадаче.

Ну и без использования отладчика дело у тебя не двинется, даже не надейся.


Сергей М.   (2008-01-24 12:26:00) [2]


> Из-за чего это может возникнуть?


Из-за того что у тебя в момент сборки запущен твой exe'шник


Сергей М.   (2008-01-24 12:25:00) [3]


> Я бы вынул из ресурса иконку, сохранил ее на диске


Не нужно ничего сохранять на диске.

Свою иконку ты успешно считываешь в память ? Этого достаточно.

А второй этап  - собственно запись считанной в память иконки в ресурс другого exe-модуля.

Вот и смотри в примере, какова последовательность действий на этом этапе:

там участвует ресурс RT_GROUT_ICON-ресурс 'MAINICON', не прочитав предварительно который ты не сможешь добраться до ID RT_ICON-ресурса конкретной интересующей тебя иконки


Artem   (2008-01-24 12:25:00) [4]

Блин, не одно так другое: пишет, что не может создать OUTPUT-файл приложения. Программа не запускается.
Убрал описание этой процедуры. Все равно.

Из-за чего это может возникнуть?


Artem   (2008-01-24 12:13:00) [5]

Было бы проще. Я бы вынул из ресурса иконку, сохранил ее на диске и запустил приведенную процедуру, присвоив IcoFileName путь к "вынутой" иконке.


Сергей М.   (2008-01-24 12:08:00) [6]


> не знает тип TFile


Нафиг он тебе сдался, этот TFile ?
В примере иконка читается из некоего стороннего файла-контейнера, а у тебя другой случай - ты ее читаешь из своихресурсов.


Artem   (2008-01-24 12:04:00) [7]

Сейчас пробую...Пишет, что не знает тип TFile - это из какого модуля?


Сергей М.   (2008-01-24 11:59:00) [8]

Понятно.

Разбирайся:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=39149


Artem   (2008-01-24 11:56:00) [9]

см.выше


Сергей М.   (2008-01-24 11:54:00) [10]

Чудесно.

А скриншот ресурсов другого exe ?


Artem   (2008-01-24 11:53:00) [11]

http://slil.ru/25393597
в котором надо заменить


Artem   (2008-01-24 11:52:00) [12]

http://slil.ru/25393594
это моего приложения


Сергей М.   (2008-01-24 11:38:00) [13]


> Скриншот чего?


Скриншоты ResExplorer'а, когда ты им просматриваешь exe-файлы (файл твоего приложения и файл приложения, в котором надо заменить иконку)


> Здесь нельзя его прикладывать


На то есть slil.ru


Сергей М.   (2008-01-24 11:36:00) [14]

Покажи скриншот икон-ресурсов обоих exe ..


Artem   (2008-01-24 11:35:00) [15]

Скриншот чего? Файла ресурсов?
И как я его покажу? Здесь нельзя его прикладывать...Могу на мыло скинуть.


Сергей М.   (2008-01-24 11:32:00) [16]


> У меня "I1" - эта та, на которую надо изменить


Скриншот покажи ..


Artem   (2008-01-24 11:31:00) [17]

ставлю s:=application.exename;- вообще ничего не изменяется


Artem   (2008-01-24 11:27:00) [18]


> ID иконки


Ее название? У меня "I1" - эта та, на которую надо изменить.


Сергей М.   (2008-01-24 11:19:00) [19]


> Не знаю


Пройдись пошагово отладчиком и узнай.


> Какой надо задать параметр?


ID иконки


Artem   (2008-01-24 11:16:00) [20]


> Какая строчка вызывает ошибку ?


Не знаю.


> Почему 3 ?


Какой надо задать параметр?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо