我注意到,如果快捷方式的目标指向特殊文件夹(如“我的电脑”或控制面板小程序) ,则方法IShellLinkW::GetPath 会返回一个空字符串。
示例代码
' CLSID_ShellLink from ShlGuid.h
Dim cShellLink As New CShellLink()
' https://msdn.microsoft.com/en-us/library/windows/desktop/ms687223%28v=vs.85%29.aspx
Dim persistFile As IPersistFile = DirectCast(cShellLink, IPersistFile)
persistFile.Load(lnkFilePath, 0)
Dim target As New StringBuilder(260)
' https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nn-shobjidl_core-ishelllinkw
Dim lnkW As IShellLinkW = DirectCast(cShellLink, IShellLinkW)
lnkW.GetPath(target, target.Capacity, Nothing, IShellLinkGetPathFlags.RawPath)
(抱歉,这里分享的 P/Invokes 太多,但您可以在此存储库中找到它们。)
上面的代码可以正确检索指向文件或目录的任何 .lnk 文件的目标。它无法检索指向特殊项目/虚拟文件夹的目标。
我的问题是:
这是设计的吗?如果没有,我错过了什么或做错了什么?(也许我的定义是错误的?)。为了检索特殊目标,我必须做什么?请注意,我想检索目标以将其显示在 aPropertyGrid
中,并使用特殊目标的克隆创建一个新目标。
请注意,我开发此代码的编程语言无关紧要,因为我首先要求的是方向,而且我接受任何用 C# 编写的解决方案。