![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как заменить иконку? [D6, WinXP]
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 ?
Какой надо задать параметр?