Форум: "Основная";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
ВнизКак поменять иконку программы Найти похожие ветки
← →
acsoft © (2004-10-27 17:46) [0]Тут недавно обсуждался этот вопрос, но вроде так и не решили проблемы. А меня заинтересовало.
Фрагмент программы:
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)Попытка использовать не ресурсы своей программы, а какой-нибудь посторонней тоже не решает проблем
← →
acsoft © (2004-10-27 20:44) [1]...
← →
Rouse_ © (2004-10-27 21:06) [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;
← →
GuAV © (2004-10-27 21:39) [3]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 deleted and 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 window handle.
А тут нужен хэндл модуля.
acsoft © (27.10.04 20:44) [1]
а какой-нибудь посторонней
Интересно а как Вам удалось "достучатся" до application сторонней программы ? нет ну в прынципе можно...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.034 c