如何从一个LNK取得该快捷方式的指向EXE?
这段时间,老被一个问题困扰,动态创建Button控件,然后从*.LNK档案取得该*.EXE档案,进而得到该EXE档案的图标,最后就是把取得的图标一一对应显示在动态创建的Button上面;
刚开始的时候,天真的认为,系统会自动的从*.LNK档案取得EXE路径的,但是现实告诉我,这样不行!只好从*.LNK档案上动手脚了,如下: unit Unit1;interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type
TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var
Form1: TForm1;implementation
uses activex,comobj,shlobj; {$R *.dfm}function ResolveLink(const ALinkFile: String): String;
var link: IShellLink; storage: IPersistFile; filedata: TWin32FindData; buf: Array[0..MAX_PATH] of Char; widepath: WideString; begin OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, link)); OleCheck(link.QueryInterface(IPersistFile, storage)); widepath := ALinkFile; Result := 'unable to resolve link'; If Succeeded(storage.Load(@widepath[1], STGM_READ)) Then If Succeeded(link.Resolve(GetActiveWindow, SLR_NOUPDATE)) Then If Succeeded(link.GetPath(buf, sizeof(buf), filedata, SLGP_UNCPRIORITY)) Then Result := buf; storage := nil; link:= nil; end;// 用法:
procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(ResolveLink('C:/delphi 7.lnk')); end;//引用方法很简单啊!ResolveLink()返回一个 String , 正是我需要的 Type :-);
end.