如何将.lnk文件创建到网络文件夹

时间:2013-10-25 11:59:10

标签: delphi networking directory

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

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

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链接也可以正常工作,所以我的问题只与映射驱动有关。

0 个答案:

没有答案