Текущий архив: 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"шник
Страницы: 1 2 вся ветка
Текущий архив: 2008.11.30;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.007 c