[ Sky Walker @ 25.12.2012. 12:05 ] @
Program snima pogresnu ikonu kada ikona sadrzi vise indeksa u sebi tj vise ikona.
Npr ikona "icon.ico" sadrzi 4 ikone ali program snima pogresan index ikone u exe fajl, ikonu [32x32-4] a treba (u ovom primeru)[32x32-8].

Pravim neki packer i kada treba da promenim ikonu, programi koji imaju vise ikona, cesto dobiju pogresan Icon_Index.

Pokusavam da nadjem na netu neki primer/funkciju koja ce ovo da mi odradi.
Nasao sam preko 40-50 primera u zadnjih par dana ali vecina "upisuju" ikonu u 256 boja ili ne rade...
Imam funkciju koja uspesno snima/vadi ikone iz pe fajla, ali problem dolazi kada ta ikona treba da se dodeli fajlu.

Ako nekom mozda nije jasno, neka pogleda project koji sam okacio i neka proba da upise ikonu (koja se takodje nalazi u
project) u bilo koji exe fajl i videce u cemu je problem...


Ako neko ima volje i malo vremena da prepravi ovaj source (ili ima neki drugi primer) bio bih mu jako zahvalan!

[ Sky Walker @ 25.12.2012. 15:52 ] @
Skinuo sam komponentu, kojom bez problema odradjuje ono sto sam hteo i ako i dalje nisam siguran kako... :)
Ako moderator zeli moze da obrise temu jer ne verujem da ce biti nekom od koristi...
Poz.
[ tkaranovic @ 26.12.2012. 06:03 ] @
Evo ovako će tema biti od koristi :)

Ovako može da se kopira pojedinačna ikona...


Code (delphi):

function CopyIcon(srcicon : PChar; destIcon : PChar; Index: integer) : Boolean;
var hFile  : Integer;
    id     : ICONDIR;
    ide    : ICONDIRENTRY;
    uRead  : DWord;
    nSize  : DWord;
    pvFile : PByte;
    dFile  : Integer;
    i: Integer;
begin
  result := False;
  hFile := CreateFile(srcicon, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hFile > 0 then
  begin
    ReadFile(hFile, id, sizeof(id), uRead, nil);
    for I := 2 to Index do
      if Index <= id.idCount then
      begin
        ReadFile(hFile, ide, sizeof(ICONDIRENTRY), uRead, nil);
        id.idEntries := ide;
      end;

    nSize := id.idEntries.common.dwBytesInRes;

    GetMem(pvFile, nSize);
    SetFilePointer(hFile, id.idEntries.dwImageOffset, nil, FILE_BEGIN);
    ReadFile(hFile, pvFile^, nSize, uRead, nil);
    CloseHandle(hFile);

    dFile := CreateFile(destIcon, GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    if dFile > 0 then
    begin
      id.idCount := 1;
      id.idEntries.dwImageOffset := sizeof(ICONDIR);
      WriteFile(dFile, id, sizeof(id), uRead, nil);
      WriteFile(dFile, pvFile^, nSize, uRead, nil);
      CloseHandle(dFile);
      result := True;
    end;

    FreeMem(pvFile);
  end;
end;