Поменять в экзешнике иконку

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by winsock, 27 Dec 2010.

Thread Status:
Not open for further replies.
  1. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    сабж, как ?


    UpdateResourceW(resFileHandle, RT_GROUP_ICON, MAKEINTRESOURCE(1), 0, (LPVOID)fileIcon.readAll().data(), fileIcon.size())


    UpdateResourceW(resFileHandle, RT_ICON, MAKEINTRESOURCE(1), 0, (LPVOID)fileIcon.readAll().data(), fileIcon.size())

    Или я вообще не туда смотрю ?


    результат в первом случае: [​IMG]

    во втором говорит что ресурсы битые...
     
  2. begin_end

    begin_end Green member

    Joined:
    4 Jan 2007
    Messages:
    259
    Likes Received:
    596
    Reputations:
    476
    Рабочий пример процедуры для смены иконки в приложении, на Delphi:
    Code:
    procedure SetAppIcon(FileName,IconFile,ResName:string);
    var I,FileGrpSize,IconGrpSize:Integer; Group:Pointer; Header:TNewHeader; FileGrp:PIconFileResGrp;
    IconGrp:PIconResDirGrp; Icon:TIcon; Stream:TMemoryStream; hUpdateRes:THandle;
    begin
     hUpdateRes:=BeginUpdateResource(PChar(FileName), False);
     Icon:=TIcon.Create;
     Icon.LoadFromFile(IconFile);
     Stream:=TMemoryStream.Create;
      try
       Icon.SaveToStream(Stream);
      finally
       Icon.Free;
      end;
     Stream.Position:=0;
     Stream.Read(Header, SizeOf(Header));
     FileGrpSize := SizeOf(TIconFileResDirGrp) + (Header.idCount - 1) * SizeOf(TIconFileResDirEntry);
     IconGrpSize := SizeOf(TIconResDirGrp) + (Header.idCount - 1) * SizeOf(TIconResDirEntry);
     GetMem(FileGrp, FileGrpSize);
     GetMem(IconGrp, IconGrpSize);
     Stream.Position:=0;
     Stream.Read(FileGrp^, FileGrpSize);
     Group:=nil;
      try
       for I:=0 to FileGrp^.idHeader.idCount - 1 do 
        begin
         with IconGrp^ do
          begin
           idHeader:=FileGrp^.idHeader;
           idEntries[i].DirHeader:=FileGrp^.idEntries[i].DirHeader;
           idEntries[i].wNameOrdinal:=I;
          end;
          with FileGrp^.idEntries[i] do
          begin
           Stream.Seek(lImageOffset, soFromBeginning);
           ReallocMem(Group, DirHeader.lBytesInRes);
           Stream.Read(Group^, DirHeader.lBytesInRes);
           UpdateResource(hUpdateRes,RT_ICON,PChar(MakeIntResource(I)), 0, Group, DirHeader.lBytesInRes);
          end;
        end;
      UpdateResource(hUpdateRes,RT_GROUP_ICON, PChar(ResName), 0, IconGrp, IconGrpSize);
      EndUpdateResource(hUpdateRes, False);
       finally
        Stream.Free;
        FreeMem(FileGrp);
        FreeMem(IconGrp);
        FreeMem(Group);
       end;
    end;
    Вкратце: причина неудачной смены иконки состоит в том, что на деле ресурс иконки в приложении представлен двояко - RT_ICON и RT_GROUP_ICON. Соответственно нужно работать с двумя ресурсами. Надеюсь, приведенный пример кода будет полезен и для вашего языка.

    Кроме этого, о иконках тут.
     
    _________________________
    2 people like this.
Thread Status:
Not open for further replies.