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

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

Как поменять иконку программы


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]

...


Наверх

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