![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как поменять иконку программы
acsoft © (2004-10-27 17:46:00)Тут недавно обсуждался этот вопрос, но вроде так и не решили проблемы. А меня заинтересовало.
Фрагмент программы:
procedure TForm1.Button1Click(Sender: TObject);
var
hExe: THANDLE;
hResLoad:THandle;
hRes: THandle;
lpResLock: PChar;
res:cardinal;
begin
try
hRes:=FindResource(application.Handle,'MAINICON',RT_GROUP_ICON);
hResLoad:=LoadResource(application.Handle, hRes);
lpResLock:=LockResource(hResLoad);
res:=beginupdateresource('test.exe',true);
updateresource(res,RT_GROUP_ICON,'MAINICON',0,lpResLock,SizeofResource(application.Handle, hRes));
endupdateresource(res,false);
except
end;
end;
То есть хочу заменить иконку тестовой программы (test.exe), на иконку своей.
Но здесь что-то не так - после выполнения процедуры у тестовой программы вообще начисто сносятся все ресурсы, а в моей программе возникает ошибка, о которой винда заявляет только после выхода из программы.
Все затыкается на процедуре LockResource(hResLoad) - никак не может Lock этот самый Resource
1)Соответственно, MAINICON есть в обеих программах.
2)Замена RT_GROUP_ICON на RT_ICON в любых комбинациях не помогает
3)Попытка использовать не ресурсы своей программы, а какой-нибудь посторонней тоже не решает проблем
GuAV (2004-10-27 21:39:00) [1]acsoft © (27.10.04 17:46)
тестовой программы вообще начисто сносятся все ресурсы
А что собственно Вы хотели ?
HANDLE BeginUpdateResource( LPCTSTR pFileName,
BOOL bDeleteExistingResources
);
...
bDeleteExistingResources
[in] Specifies whether to delete the pFileName parameter's existing resources. If this parameter is TRUE, existing resources are deletedand the updated executable file includes only resources added with the UpdateResource function.
> application.Handle
При чём тут окно ? Вы вообще пробовали если не Ctrl+Click то хотя бы F1:
Use Handle when calling Windows API functions that require a parent windowhandle.
А тут нужен хэндл модуля.
acsoft © (27.10.04 20:44) [1]
а какой-нибудь посторонней
Интересно а как Вам удалось "достучатся" до application сторонней программы ? нет ну в прынципе можно...
Rouse_ (2004-10-27 21:06:00) [2]Вот тебе примерчик.
Что делает, помещает в ехе текстовый ресурс с датой модификации и базу данных...
function AddRes(const ResDB, EXE: String; Delete: Boolean = True): Boolean;
var
hFile: HWND;
F: TFileStream;
Buf: array of Byte;
Ini: TextFile;
begin
Result := False;
AssignFile(Ini, 'C:\ini.tmp');
Rewrite(Ini);
Write(Ini, DateToStr(Now) + '.mdb');
CloseFile(Ini);
hFile := BeginUpdateResource(PChar(EXE), False);
try
if hFile = 0 then Exit;
F := TFileStream.Create('C:\ini.tmp', fmOpenRead);
try
SetLength(Buf, F.Size);
F.Position := 0;
F.Read(Buf[0], F.Size);
Result := UpdateResource(hFile, 'INSTALL', 'RES_INI',
0, @Buf[0], F.Size);
if not Result then Exit;
SetLength(Buf, 0);
finally
F.Free;
end;
F := TFileStream.Create(ResDB, fmOpenRead);
try
SetLength(Buf, F.Size);
F.Position := 0;
F.Read(Buf[0], F.Size);
Result := UpdateResource(hFile, 'INSTALL', 'RES_MDB',
0, @Buf[0], F.Size);
if not Result then Exit;
SetLength(Buf, 0);
Result := True;
finally
F.Free;
end;
finally
if FileExists('C:\ini.tmp') then DeleteFile('C:\ini.tmp');
if Delete then
if FileExists(ResDB) then DeleteFile(ResDB);
EndUpdateResource(hFile, False);
end;
end;
acsoft (2004-10-27 20:44:00) [3]...