在Delphi XE7中,我想使用以下代码替换shell链接文件(.lnk)的链接目标,即使链接目标不再存在:
uses
JclShell;
...
procedure ShellLinkReplaceLinkTarget(const AShellLinkFile, ANewTarget: string);
var
ThisShellLink: JclShell.TShellLink;
begin
if (JclShell.ShellLinkResolve(AShellLinkFile, ThisShellLink, SLR_ANY_MATCH or SLR_NO_UI) = S_OK) then
begin
ThisShellLink.Target := ANewTarget;
JclShell.ShellLinkCreate(ThisShellLink, AShellLinkFile);
end
else CodeSite.Send('ShellLinkResolve Failed!');
end;
显然,当链接目标不再存在时,无法使用ShellLinkResolve
从链接文件中获取数据,正如大卫亲切地解释的那样。
那么在这种情况下如何从链接文件中获取数据?
答案 0 :(得分:1)
为什么你不想使用这样简单的代码:
procedure ShellLinkReplaceLinkTarget(const AShellLinkFile, ANewTarget: UnicodeString);
var
ShellLink: IShellLinkW;
PersistFile: IPersistFile;
begin
OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLinkW, ShellLink));
try
OleCheck(ShellLink.QueryInterface(IPersistFile, PersistFile));
try
OleCheck(PersistFile.Load(PWideChar(AShellLinkFile), STGM_READWRITE));
OleCheck(ShellLink.SetIDList(nil));
OleCheck(ShellLink.SetPath(PWideChar(ANewTarget)));
OleCheck(PersistFile.Save(PWideChar(AShellLinkFile), True));
finally
PersistFile := nil;
end;
finally
ShellLink := nil;
end;
end;
还有一个非常重要的细节。某些lnk文件可以包含不同的属性,如背景颜色(在Windows 8中)。如果重新创建lnk文件属性将丢失。