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:
| TShellLinkInfo = record PathName: string; Arguments: string; Description: string; WorkingDirectory: string; IconLocation: string; IconIndex: integer; end;
procedure GetShellLinkInfo(const LinkFile: WideString; var SLI: TShellLinkInfo); var SL: IShellLink; PF: IPersistFile; FindData: TWin32FindData; AStr: Array[0..MAX_PATH] of char; begin OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, SL)); PF := SL as IPersistFile; OleCheck(PF.Load(PWideChar(LinkFile), STGM_READ)); OleCheck(SL.Resolve(0, SLR_ANY_MATCH or SLR_NO_UI));
with SLI do begin OleCheck(SL.GetPath(AStr, MAX_PATH, FindData, SLGP_RAWPATH)); PathName := AStr;
OleCheck(SL.GetArguments(AStr, MAX_PATH)); Arguments := AStr;
OleCheck(SL.GetDescription(AStr, MAX_PATH)); Description := AStr;
OleCheck(SL.GetWorkingDirectory(AStr, MAX_PATH)); WorkingDirectory := AStr;
OleCheck(SL.GetIconLocation(AStr, MAX_PATH, IconIndex)); IconLocation := AStr; end; end;
procedure TMenuIcon.RunLink; var SLI: TShellLinkInfo; begin if ExtractFileExt(FileName) = '.lnk' then begin GetShellLinkInfo(Filename, SLI); if ExtractFileExt(SLI.PathName) = '' then ShellExecute(Application.Handle, 'open', 'explorer.exe', PChar(SLI.PathName), nil, SW_NORMAL) else ShellExecute(Application.Handle, 'open', PChar(FileName), nil, PChar(ExtractFilePath(FileName)), SW_NORMAL); end else ShellExecute(Application.Handle, 'open', PChar(FileName), nil, PChar(ExtractFilePath(FileName)), SW_NORMAL);
end; |