-
Коллеги, помогите решить следующую задачу. В моей программе в файле ресурсов (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, RT_ICON, PChar(1), LANG_NEUTRAL,
lpResLock, SizeofResource(hExe, hRes)); 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.'); Нужна Ваша помощь. Заранее благодарю участников дискуссии.
-
> Ошибка начинается с
Что, прямо так и говорит, мол, "я, ошибка, начинаюсь с" ?
-
Указанное имя ресурса не найде в файле образа говорит
-
Файл образа - это ресурс в программе, в которой изменяется иконка в данном случае?
-
> Указанное имя ресурса не найде в файле образа говорит
Врешь бессовестно.
"Could not load exe" переводится совсем иначе.
-
> Artem (23.01.08 22:01)
> Вопрос в следующем: как заменить иконку другого приложения
SendMessage(wnd, WM_SETICON, 1, AIcon.Handle)
-- Regards, LVT.
-
RaiseLastWin32Error() говорит
-
> SendMessage(wnd, WM_SETICON, 1, AIcon.Handle)
wnd - это путь к программе, в которой необходимо изменить иконку?
-
> RaiseLastWin32Error() говорит
Начинаются интимные подробности)
В приведенном изначально коде нет никаких "RaiseLastWin32Error", однако "оно" что-то там говорит, причем неизвестно что)
-
язаменил ShowMessage на RaiseLastWin32Error()
-
> аменил ShowMessage на RaiseLastWin32Error()
Малацца.
И что же говорит RaiseLastWin32Error ?
Стесняюсь спросить - неужели "'Could not load exe" ?)
-
Повторяю: Указанное имя ресурса не найдено в файле образа
-
Тогда ты врешь здесь
> Ошибка начинается с hExe:=LoadLibrary(PChar(S));
Вызов ф-ции LoadLibrary() не может вернуть такую ошибку.
-
Я не знаю в чем ошибка, поэтому и обратился за помощью.
-
> не знаю в чем ошибка
Но при этом ничтоже сумняшеся утверждаешь, что ошибка начинается при выполнении такой-то конкретной строки, а именно LoadLibrary ?
-
Я так утверждал, потому что первое сообщение, которое появлялось было именно 'Could not load exe', а потом все остальные подряд...
-
> потому что первое сообщение, которое появлялось было именно > 'Could not load exe'
Если библиотека не была загружена (о чем, собственно, и говорит сообщение 'Could not load exe'), то дальнейший код попросту лишен смысла.
Ты добился безошибочной загрузки библиотеки ?
-
Да, добился. Но теперь "указанный тип ресурса в файле образа отсутствует". Почему?
Я изменил: result:=UpdateResource(hUpdateRes, PChar('ICON'), PChar('MAINICON'), LANG_NEUTRAL, lpResLock, SizeofResource(hExe, hRes)); if result=False then RaiseLastWin32Error();
Все равно ругается. Я не правильно задаю тип получается? Смотрел через ResXplor данный файл. Иконка программы находится в разделе "ICON", тогда почему ошибка???
-
-
Что писать в MakeIntResource? SourceIndex, DestIndex не заданы и не описаны в примере...
-
Измененный код: 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); Пишет, что не найден указанный модуль.... ??
-
> Пишет, что не найден указанный модуль
Какая строчка вызывает ошибку ?
> MakeIntResource(3)
Почему 3 ?
-
> Какая строчка вызывает ошибку ?
Не знаю.
> Почему 3 ?
Какой надо задать параметр?
-
> Не знаю
Пройдись пошагово отладчиком и узнай.
> Какой надо задать параметр?
ID иконки
-
> ID иконки
Ее название? У меня "I1" - эта та, на которую надо изменить.
-
ставлю s:=application.exename; - вообще ничего не изменяется
-
> У меня "I1" - эта та, на которую надо изменить
Скриншот покажи ..
-
Скриншот чего? Файла ресурсов? И как я его покажу? Здесь нельзя его прикладывать...Могу на мыло скинуть.
-
Покажи скриншот икон-ресурсов обоих exe ..
-
> Скриншот чего?
Скриншоты ResExplorer'а, когда ты им просматриваешь exe-файлы (файл твоего приложения и файл приложения, в котором надо заменить иконку)
> Здесь нельзя его прикладывать
На то есть slil.ru
-
-
-
Чудесно.
А скриншот ресурсов другого exe ?
-
см.выше
-
-
Сейчас пробую...Пишет, что не знает тип TFile - это из какого модуля?
-
> не знает тип TFile
Нафиг он тебе сдался, этот TFile ? В примере иконка читается из некоего стороннего файла-контейнера, а у тебя другой случай - ты ее читаешь из своих ресурсов.
-
Было бы проще. Я бы вынул из ресурса иконку, сохранил ее на диске и запустил приведенную процедуру, присвоив IcoFileName путь к "вынутой" иконке.
-
Блин, не одно так другое: пишет, что не может создать OUTPUT-файл приложения. Программа не запускается. Убрал описание этой процедуры. Все равно.
Из-за чего это может возникнуть?
-
> Я бы вынул из ресурса иконку, сохранил ее на диске
Не нужно ничего сохранять на диске.
Свою иконку ты успешно считываешь в память ? Этого достаточно.
А второй этап - собственно запись считанной в память иконки в ресурс другого exe-модуля.
Вот и смотри в примере, какова последовательность действий на этом этапе:
там участвует ресурс RT_GROUT_ICON-ресурс 'MAINICON', не прочитав предварительно который ты не сможешь добраться до ID RT_ICON-ресурса конкретной интересующей тебя иконки
-
> Из-за чего это может возникнуть?
Из-за того что у тебя в момент сборки запущен твой exe'шник
-
Вот тебе еще в помощь: http://forum.vingrad.ru/forum/topic-182172.htmlИ не пытайся слепо передирать чужой код - анализируй, думай, принимай решения по его адаптации к твоей задаче. Ну и без использования отладчика дело у тебя не двинется, даже не надейся.
|