我目前正在尝试为已安装的网络驱动器上的文件夹生成链接文件。我搜索了有关 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 链接也可以工作,所以我的问题只与映射驱动器有关。