Delphi 解析网络快捷方式

Delphi 解析网络快捷方式,delphi,winapi,Delphi,Winapi,我通过网络快捷方式向windows添加了一些FTP服务器 如何通过WinAPI获取FTP地址 使用SHGetFolderPath/CSIDL_NETHOOD,我可以获得target.lnk文件的位置。但是我怎样才能获得该文件的FTP URL呢 一个“normal”.lnk文件,我可以通过以下方式解决: ShellLink := CreateComObject(CLSID_ShellLink) as IShellLink; ShellLink.QueryInterface(IPersist

我通过网络快捷方式向windows添加了一些FTP服务器

如何通过WinAPI获取FTP地址

使用SHGetFolderPath/CSIDL_NETHOOD,我可以获得target.lnk文件的位置。但是我怎样才能获得该文件的FTP URL呢

一个“normal”.lnk文件,我可以通过以下方式解决:

  ShellLink := CreateComObject(CLSID_ShellLink) as IShellLink;
  ShellLink.QueryInterface(IPersistFile, PersistFile);
  PersistFile.Load('C:\Test.lnk', STGM_READ);
  ShellLink.Resolve(WindowHandle, 0);
  Filename[0] := #0;
  ShellLink.GetPath(PChar(@Filename[0]), Length(Filename), pfd, 0);

。。。但这不适用于地址的网络快捷方式的Target.lnk文件。

IShellLink::GetPath
用于检索文件系统路径(仅驱动器号或UNC根目录)。文档中没有明确说明这一点,但它在内部使用了
SHGetPathFromIDListEx
,MSDN对此函数有如下说明:

将项目标识符列表转换为文件系统路径


如果您想要原始快捷方式目标,您的最佳选择通常是
IShellLink::GetIDList
。您可以通过在id列表上使用来获取解析名称。

可能是因为您甚至无法读取注释。@Victoria这根本不是真的,这很不寻常,但它们可以包含URL。如果你能阅读,你会看到OP没有说是他们创建的,他们只是想阅读。@Anders,我说也许你不能阅读URL链接,因为链接文章中提到的注释说你不能创建这样的链接。链接可以包含URL是可以的,但是您至少可以通过
IShellLink
界面读取它们吗?你知道这是怎么回事,那么就发布一个答案吧。@Victoria我已经开始写我的答案了,但我必须先在调试器中通过函数来验证我的假设。@Victoria是的,你可以。URL作为id列表存储在.lnk中,GetIDList工作正常。因为URL不是文件系统路径,所以不能用GetPath方法读取它。