Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.11.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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"шник



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

Форум: "WinAPI";
Текущий архив: 2008.11.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.009 c
4-1201263223
BBCHa
2008-01-25 15:13
2008.11.30
Com-порт и CLX


8-1188300158
Dr. Andrew
2007-08-28 15:22
2008.11.30
Ошибка при заполнении текста bitmap. Почему?


2-1224760314
azamat
2008-10-23 15:11
2008.11.30
работа с типами данных


15-1222744713
Maxer123
2008-09-30 07:18
2008.11.30
Urban Kraftway K23


2-1224767025
Real.K
2008-10-23 17:03
2008.11.30
Выполнить функцию по ее имени





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский