即使链接目标不再存在,如何从ShellLink获取数据?

时间:2015-03-16 13:24:59

标签: shell delphi delphi-xe7

在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从链接文件中获取数据,正如大卫亲切地解释的那样。

那么在这种情况下如何从链接文件中获取数据?

1 个答案:

答案 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文件属性将丢失。