Autor Beitrag
noNeed 4 aNick
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Sa 16.07.05 18:49 
Hi zusammen,

ich wollte eine Prozedur schreiben, mit der man auf Basis der CSIDL die Icons für zB den Arbeitsplatz oder den Papierkorb auslesen kann.

Nun habe ich mit Google und MSDN was zusammengebastelt, was natürlich nicht funktioniert...
Ich denke, das der Code vom Ansatz her richtig is, aber irgendwelche API Funktionen, die ich heute zum ersten Mal gesehen habe, falsch aufgerufen werden. Daher poste ich mal den code hier:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ActiveX, ShlObj, ShellApi, ExtCtrls, StdCtrls;

const GIL_FORSHORTCUT = $0080;

type

  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  IID_IExtractIcon: TGUID = '{000214EB-0000-0000-C000-000000000046}';

implementation

{$R *.dfm}

procedure FreePidl(pidl: PItemIDList);
var
  allocator: IMalloc;
begin
  if Succeeded(shlobj.SHGetMalloc(allocator)) then
  begin
    allocator.Free(pidl);
    {$IFDEF VER90}
    allocator.Release;
    {$ENDIF}
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  pShell, ShellFolder: IShellFolder;
  pidl: PITEMIDLIST;
  PMalloc: IMalloc;

  iextIcon: IExtractIcon;
  reserved: UINT;
  s: string;
  index, len: integer;
  flags: Cardinal;

 begin

  try
    SHGetDesktopFolder(ShellFolder);
    SHGetSpecialFolderLocation(0, CSIDL_DRIVES, pidl);
    SHGetMalloc(PMalloc);
    ShellFolder.BindToObject(pidl, nil, IID_IShellFolder, Pointer(pShell));
    pShell.GetUIObjectOf(0, 1, pidl, IID_IExtractIcon , @reserved, iextIcon);

    SetLength(s, MAX_PATH);
    len := MAX_PATH;

    iextIcon.GetIconLocation(GIL_FORSHORTCUT, @s[1], len, index, flags);
    ShowMessage(s);

   // Image1.Picture.Icon.Handle := IconHandle;
  finally
    pMalloc._Release;
    pMalloc := nil;
    FreePIDL(pidl);
end;

end;

end.


Wäre toll, wenn jmd ne Idee hätte, wie ich das lösen könnte

ThxInAdv
Alex
Marco D.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: Sa 16.07.05 19:14 
Titel: icons auslesen
Ich weiß nicht ob meine antwort dir weiterhelfen wird (ich fürchte nicht...) aber ich kenn eine ganz andere möglichkeit. Es gibt auf der microsoft seite das programm iconspro (den link weiß ich nicht aber wenn du willst kann ich es dir schicken) damit kann man z.b. aus der shell32.dll die systemicons extrahieren und als .ico speichern. Ist es das was du willst?
noNeed 4 aNick Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Sa 16.07.05 19:24 
Ne, ich hab selber so ein Programm.

Das is mir erstens bissel zu blöd, alle Icons rauszuladen und zweitens will ich das allein schon aus Lerngründen können ;)