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 public 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);
finally pMalloc._Release; pMalloc := nil; FreePIDL(pidl); end;
end;
end. |