Einzelnen Beitrag anzeigen

Benutzerbild von ErazerZ
ErazerZ

Registriert seit: 27. Mai 2005
Ort: Baden
315 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Icon einer Anwendung speichern

  Alt 12. Aug 2005, 18:52
mein code bis jetzt ..
Delphi-Quellcode:
function SaveIcon(Filename: String; Savename: String): Boolean;
var
  lpResource, lpResource2, Buffer: PChar;
  hResource: HRSRC;
  ResSize, ResSize2, Written: LongWord;
  hMem, h, hExe: THandle;
  ID: Integer;
begin
  Result := False;
  bGotResource := False;
  bStringRes := False;
  hExe := LoadLibrary(PChar(Filename));

  EnumResourceNames(hExe, RT_GROUP_ICON, @ResourceNameCallback, hInstance); // les nur die namen heraus, immer nur den ersten, wegen testen ..

  if bStringRes then // wenns ein string ist, ansonsten integer
    hResource := FindResource(hExe, PChar(ResourceNameStr), RT_GROUP_ICON)
  else
    hResource := FindResource(hExe, MAKEINTRESOURCE(ResourceName), RT_GROUP_ICON);
  ResSize := sizeofResource(hExe, hResource);
  hMem := LoadResource(hExe, hResource);
  lpResource := LockResource(hMem);

// testen - erstes icon auslesen
// ID := LookupIconIdFromDirectoryEx(PBYTE(lpResource), True, SM_CXICON, SM_CYICON, LR_DEFAULTCOLOR);
  ID := 1;
  hResource := FindResource(hExe, MAKEINTRESOURCE(ID), MAKEINTRESOURCE(RT_ICON));
  ResSize2 := sizeofResource(hExe, hResource);
  hMem := LoadResource(hExe, hResource);
  lpResource2 := LockResource(hMem);

  if lpResource <> nil then
  begin
    h := CreateFile(PChar(Savename), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    GetMem(Buffer, 1);
    // die hier hab mit nem hexeditor herausgefunden, indem ich eine datei (ico) mit reshack entpack habe und einfach eine binäre icon-datei mit der anderen icon datei verglichen habe
    // patch other stuff from Group Icon
    PByte(Cardinal(lpResource) + $7)^ := $40;
    PByte(Cardinal(lpResource) + $12)^ := $16;
    // zero offsets ( 2bytes )
    PByte(Cardinal(Buffer) + $0)^ := $00;
    PByte(Cardinal(Buffer) + $1)^ := $00;
    // write to file
    WriteFile(h, lpResource^, ResSize, Written, nil);
    WriteFile(h, Buffer^, 2, Written, nil);
    WriteFile(h, lpResource2^, ResSize2, Written, nil);
    CloseHandle(h);
    Result := True;
  end;
  FreeLibrary(hExe);
end;
  Mit Zitat antworten Zitat