Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как заменить иконку? [D6, WinXP]


Страницы:   1 2 3

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]

Указанное имя ресурса не найде в файле образа говорит


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо