Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.30;
Скачать: CL | DM;

Вниз

Как заменить иконку?   Найти похожие ветки 

 
Artem   (2008-01-23 22:01) [0]

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

В моей программе в файле ресурсов (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-23 22:21) [1]


> Ошибка начинается с


Что, прямо так и говорит, мол, "я, ошибка, начинаюсь с" ?


 
Artem   (2008-01-23 22:31) [2]

Указанное имя ресурса не найде в файле образа говорит


 
Artem   (2008-01-23 22:49) [3]

Файл образа - это ресурс в программе, в которой изменяется иконка в данном случае?


 
Сергей М. ©   (2008-01-23 22:55) [4]


> Указанное имя ресурса не найде в файле образа говорит


Врешь бессовестно.

"Could not load exe"  переводится совсем иначе.


 
Leonid Troyanovsky ©   (2008-01-23 22:57) [5]


> Artem   (23.01.08 22:01)  

> Вопрос в следующем: как заменить иконку другого приложения

SendMessage(wnd, WM_SETICON, 1, AIcon.Handle)

--
Regards, LVT.


 
Artem   (2008-01-23 22:57) [6]

RaiseLastWin32Error() говорит


 
Artem   (2008-01-23 23:01) [7]


> SendMessage(wnd, WM_SETICON, 1, AIcon.Handle)


wnd - это путь к программе, в которой необходимо изменить иконку?


 
Сергей М. ©   (2008-01-23 23:03) [8]


> RaiseLastWin32Error() говорит


Начинаются интимные подробности)

В приведенном изначально коде нет никаких "RaiseLastWin32Error", однако "оно" что-то там говорит, причем неизвестно что)


 
Artem   (2008-01-23 23:04) [9]

язаменил ShowMessage на RaiseLastWin32Error()


 
Сергей М. ©   (2008-01-23 23:08) [10]


> аменил ShowMessage на RaiseLastWin32Error()


Малацца.

И что же говорит RaiseLastWin32Error ?

Стесняюсь спросить - неужели ""Could not load exe" ?)


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

Повторяю: Указанное имя ресурса не найдено в файле образа


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

Тогда ты врешь здесь


> Ошибка начинается с hExe:=LoadLibrary(PChar(S));


Вызов ф-ции LoadLibrary() не может вернуть такую ошибку.


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

Я не знаю в чем ошибка, поэтому и обратился за помощью.


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


>  не знаю в чем ошибка


Но при этом ничтоже сумняшеся утверждаешь, что ошибка начинается при выполнении такой-то конкретной строки, а именно LoadLibrary ?


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

Я так утверждал, потому что первое сообщение, которое появлялось было именно "Could not load exe", а потом все остальные подряд...


 
Сергей М. ©   (2008-01-24 01:30) [16]


> потому что первое сообщение, которое появлялось было именно
> "Could not load exe"


Если библиотека не была загружена (о чем, собственно, и говорит сообщение "Could not load exe"), то дальнейший код попросту лишен смысла.

Ты добился безошибочной загрузки библиотеки ?


 
Artem   (2008-01-24 01:36) [17]

Да, добился. Но теперь "указанный тип ресурса в файле образа отсутствует". Почему?

Я изменил:
result:=UpdateResource(hUpdateRes,      
           PChar("ICON"),                  
           PChar("MAINICON"),                
           LANG_NEUTRAL,
           lpResLock,                  
           SizeofResource(hExe, hRes));
 if result=False then RaiseLastWin32Error();

Все равно ругается. Я не правильно задаю тип получается? Смотрел через ResXplor данный файл. Иконка программы находится в разделе "ICON", тогда почему ошибка???


 
Сергей М. ©   (2008-01-24 09:44) [18]

см. MAKEINTRESOURCE

http://www.cracklab.ru/f/index.php?action=vthread&topic=4938&forum=6&page=-1


 
Artem   (2008-01-24 10:38) [19]

Что писать в MakeIntResource?
SourceIndex, DestIndex не заданы и не описаны в примере...


 
Artem   (2008-01-24 10:51) [20]

Измененный код:

s:=ExtractFilePath(ParamStr(0))+application.exename;
hExe:=LoadLibrary(PChar(S));    
 if (hExe=0) then RaiseLastWin32Error();

 hRes:=FindResource(hExe, MakeIntResource(3), RT_ICON);  
 if (hRes=0) then RaiseLastWin32Error();

 hResLoad:=LoadResource(hExe, hRes);
 if (hResLoad=0) then RaiseLastWin32Error();

 lpResLock:=LockResource(hRes);    
 if (lpResLock=nil) then RaiseLastWin32Error();

 SS:=EXEFileName;
 hUpdateRes:=BeginUpdateResource(PChar(SS), false);
 if (hUpdateRes=0) then RaiseLastWin32Error();

 result:=UpdateResource(hUpdateRes,      
           RT_ICON,                  
           MakeIntResource(3),                  
           LANG_NEUTRAL,
           lpResLock,                  
           SizeofResource(hExe, hRes));
 if result=False then RaiseLastWin32Error();

 EndUpdateResource(hUpdateRes, false);

 FreeLibrary(hExe);


Пишет, что не найден указанный модуль....
??


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


> Пишет, что не найден указанный модуль


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


> MakeIntResource(3)


Почему 3 ?


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


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


Не знаю.


> Почему 3 ?


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


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


> Не знаю


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


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


ID иконки


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


> ID иконки


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


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

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


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


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


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


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

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


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

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


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


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


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


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


На то есть slil.ru


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

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


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

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


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

Чудесно.

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


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

см.выше


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

Понятно.

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


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

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


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


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


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


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

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


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

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

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


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


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


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

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

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

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

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


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


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


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


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

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

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

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

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



Страницы: 1 2 вся ветка

Текущий архив: 2008.11.30;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.017 c
2-1224237799
Rolf
2008-10-17 14:03
2008.11.30
Работа с класом внутри функции.


2-1224155412
Vlad Oshin
2008-10-16 15:10
2008.11.30
нужно как можно раньше контрлам формы повесить метод


4-1200806775
MTM
2008-01-20 08:26
2008.11.30
X509Certificate


11-1195733927
Юрий_К
2007-11-22 15:18
2008.11.30
Про TrayIcon


2-1224600668
romychk
2008-10-21 18:51
2008.11.30
dat файлы