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