![]() |
| ||
|
|
Новости |
Поиск |
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 11:10:00) [21]
> Пишет, что не найден указанный модуль
Какая строчка вызывает ошибку ?
> MakeIntResource( 3)
Почему 3?
Artem (2008-01-24 10:51:00) [22]Измененный код:
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);
Пишет, что не найден указанный модуль....
??
Artem (2008-01-24 10:38:00) [23]Что писать в MakeIntResource?
SourceIndex, DestIndex не заданы и не описаны в примере...
Сергей М. (2008-01-24 09:44:00) [24]см. MAKEINTRESOURCE
http://www.cracklab.ru/f/index.php?action=vthread&topic=4938&forum=6&page=-1
Artem (2008-01-24 01:36:00) [25]Да, добился. Но теперь "указанный тип ресурса в файле образа отсутствует". Почему?
Я изменил:
result:=UpdateResource(hUpdateRes,
PChar('ICON'),
PChar('MAINICON'),
LANG_NEUTRAL,
lpResLock,
SizeofResource(hExe, hRes));
if result=False then RaiseLastWin32Error();
Все равно ругается. Я не правильно задаю тип получается? Смотрел через ResXplor данный файл. Иконка программы находится в разделе "ICON", тогда почему ошибка???
Сергей М. (2008-01-24 01:30:00) [26]
> потому что первое сообщение, которое появлялось было именно
> 'Could not load exe'
Если библиотека не была загружена (о чем, собственно, и говорит сообщение 'Could not load exe'), то дальнейший код попросту лишен смысла.
Ты добился безошибочной загрузки библиотеки ?
Artem (2008-01-24 00:46:00) [27]Я так утверждал, потому что первое сообщение, которое появлялось было именно 'Could not load exe', а потом все остальные подряд...
Сергей М. (2008-01-24 00:42:00) [28]
> не знаю в чем ошибка
Но при этом ничтоже сумняшеся утверждаешь, что ошибка начинается при выполнении такой-то конкретной строки, а именно LoadLibrary ?
Artem (2008-01-24 00:21:00) [29]Я не знаю в чем ошибка, поэтому и обратился за помощью.
Сергей М. (2008-01-24 00:12:00) [30]Тогда ты врешь здесь
> Ошибка начинается с hExe:=LoadLibrary(PChar(S));
Вызов ф-ции LoadLibrary() не может вернуть такую ошибку.
Artem (2008-01-24 00:07:00) [31]Повторяю: Указанное имя ресурса не найдено в файле образа
Сергей М. (2008-01-23 23:08:00) [32]
> аменил ShowMessage на RaiseLastWin32Error()
Малацца.
И что же говорит RaiseLastWin32Error ?
Стесняюсь спросить - неужели "'Could not load exe" ?)
Artem (2008-01-23 23:04:00) [33]язаменил ShowMessage на RaiseLastWin32Error()
Сергей М. (2008-01-23 23:03:00) [34]
> RaiseLastWin32Error() говорит
Начинаются интимные подробности)
В приведенном изначально коде нет никаких "RaiseLastWin32Error", однако "оно" что-то там говорит, причем неизвестно что)
Artem (2008-01-23 23:01:00) [35]
> SendMessage(wnd, WM_SETICON, 1, AIcon.Handle)
wnd - это путь к программе, в которой необходимо изменить иконку?
Artem (2008-01-23 22:57:00) [36]RaiseLastWin32Error() говорит
Leonid Troyanovsky (2008-01-23 22:57:00) [37]
> Artem (23.01.08 22:01)
> Вопрос в следующем: как заменить иконку другого приложения
SendMessage(wnd, WM_SETICON, 1, AIcon.Handle)
--
Regards, LVT.
Сергей М. (2008-01-23 22:55:00) [38]
> Указанное имя ресурса не найде в файле образа говорит
Врешь бессовестно.
"Could not load exe" переводится совсем иначе.
Artem (2008-01-23 22:49:00) [39]Файл образа - это ресурс в программе, в которой изменяется иконка в данном случае?
Artem (2008-01-23 22:31:00) [40]Указанное имя ресурса не найде в файле образа говорит