1

我目前正在尝试为已安装的网络驱动器上的文件夹生成链接文件。我搜索了有关 IShellLink 对象的 MS 文档,但我真的不知道还能尝试什么。

我设法使用以下代码为当前系统上的文件/文件夹创建了 lnk 文件,以及指向映射网络驱动器上的文件的链接:

function GenerateLink(ATarget, ASaveTarget: string): boolean;
var
  IObject: IUnknown;
  ISLink: IShellLink;
  IPFile: IPersistFile;

  ShellFolder: IShellFolder;
  BindContext: IBindCtx;
  FileSystem: IFileSystemBindData;

  chEaten: Cardinal;
  dwAttributes: Cardinal;
  PIDL: PItemIDList;
begin
  Result := false;

  CoInitialize(nil);

  IObject := CreateComObject(CLSID_ShellLink);
  FileSystem := TFileSystemBindData.Create;

  ISLink := IObject as IShellLink;
  IPFile := IObject as IPersistFile;

  SHGetDesktopFolder(ShellFolder);
  CreateBindCtx(0, BindContext);
  BindContext.RegisterObjectParam(STR_FILE_SYS_BIND_DATA, FileSystem);
  ShellFolder.ParseDisplayName(0, Pointer(BindContext), pChar(ATarget), chEaten, PIDL,
    dwAttributes);

  if Assigned(PIDL) then
    ISLink.SetIDList(PIDL)
  else
    exit;

  IPFile.Save(PWideChar(ASaveTarget), false);
  Result := true;
end;

无论文件位于何处,此代码都适用于文件,但不适用于文件夹。我采用了这种方法:

function GenerateFolderLink(ATarget, ASaveTarget: String): boolean;
var
  IObject: IUnknown;
  ISLink: IShellLink;
  IPFile: IPersistFile;
begin
  Result := false;
  CoInitialize(nil);
  IObject := CreateComObject(CLSID_ShellLink);
  ISLink := IObject as IShellLink;
  IPFile := IObject as IPersistFile;

  with ISLink do
  begin
    SetPath(pChar(ATarget));
    SetWorkingDirectory(pChar(ExtractFilePath(ATarget)));
  end;

  IPFile.Save(PWideChar(ASaveTarget), false);

  Result := true;
end;

这适用于所有本地文件夹。

唯一缺少的是映射网络驱动器上的文件夹。虽然指向“X:\”的链接有效,但指向特定文件夹的链接已损坏(“X:\TEST”)

感谢您的输入 ;)

更新:我刚刚发现,使用 UNC-Path 链接也可以工作,所以我的问题只与映射驱动器有关。

4

0 回答 0