核心 COM 介面
IShellLink:設定目標路徑、參數、描述、工作目錄、圖示。
IPersistFile:將捷徑持久化為 .lnk 檔案。
通用建立函數
uses ShlObj, ActiveX, ComObj, Registry;
type
TShortcutLocation = (slDesktop, slSendTo, slQuickLaunch, slStartMenu);
procedure CreateShortcut(const FileName, Description, Arguments: string;
Location: TShortcutLocation);
var
unk: IUnknown; sl: IShellLink; pf: IPersistFile;
dir, lnkName, wPath: WideString;
reg: TRegistry; key, tmp: string;
begin
unk := CreateComObject(CLSID_ShellLink);
sl := unk as IShellLink;
pf := unk as IPersistFile;
with sl do begin
SetPath(PChar(FileName));
SetArguments(PChar(Arguments));
SetDescription(PChar(Description));
SetWorkingDirectory(PChar(ExtractFilePath(FileName)));
end;
// 讀取特殊資料夾路徑 (註冊表)
reg := TRegistry.Create;
try
reg.RootKey := HKEY_CURRENT_USER;
key := REGSTR_PATH_EXPLORER; // 'Software\Microsoft\Windows\CurrentVersion\Explorer'
tmp := key + '\Shell Folders';
reg.OpenKey(tmp, False);
case Location of
slDesktop: dir := reg.ReadString('Desktop');
slSendTo: dir := reg.ReadString('SendTo');
slStartMenu: dir := reg.ReadString('Start Menu');
slQuickLaunch: begin
dir := reg.ReadString('AppData');
dir := dir + '\Microsoft\Internet Explorer\Quick Launch';
end;
end;
finally reg.Free; end;
if dir <> '' then begin
lnkName := ChangeFileExt(ExtractFileName(FileName), '.lnk');
wPath := dir + '\' + lnkName;
pf.Save(PWChar(wPath), False); // False = 不覆蓋唯讀
end;
end;
使用範例
procedure TForm1.btnDesktopClick(Sender: TObject);
begin
CreateShortcut(Application.ExeName, 'Delphi 建立的捷徑', '', slDesktop);
end;
procedure TForm1.btnQuickLaunchClick(Sender: TObject);
begin
CreateShortcut(Application.ExeName, '快速啟動', '', slQuickLaunch);
end;
補充:網址捷徑 (.url)
procedure CreateInternetShortcut(const Name, URL: string);
var sl: IUniformResourceLocator; pf: IPersistFile; dir: string;
begin
// 類似流程,使用 CLSID_InternetShortcut
// 此處略,參考 MSDN IUniformResourceLocator
end;
注意事項
- Vista+ 建議用
SHGetKnownFolderPath(FOLDERID_Desktop, ...) 替代註冊表讀取。
- 需在專案
uses 引入 ComObj 確保 COM 單元初始化 (CoInitialize)。
- 捷徑建立需寫入權限,受限環境可能失敗。