-
Коллеги, помогите решить следующую задачу. В моей программе в файле ресурсов (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 не заданы и не описаны в примере...
|