FTP PIDL的{SHGetNameFromIDList失败

时间:2017-09-18 11:18:32

标签: winapi com shell32

如果我在Windows上添加FTP网络位置,它会创建一个指向该位置的.lnk文件。如果我通过 IShellLink 打开链接,获取其 IShellFile 目标,并将其绑定到 IShellFolder ,我可以枚举远程位置上的文件(登录后使用 IShellFolder :: EnumObjects ,并返回正确的文件。

但是,如果我尝试通过 SHGetNameFromIDList IShellItem :: GetDisplayName 获取任何文件的名称,则该函数将失败并显示0x80070057(无效参数)HRESULT。我确定PIDL是有效的,因为我可以构造 IShellItem ,其大小为72字节,但任何获取路径的尝试都会失败。访问从PIDL构造的 IShellItem2 上我能想到的任何属性也会失败,并且只需调用 SHGetPathFromIDList

那么,如何从PIDL中获取任何有意义的名称,最好是SIGDN_PARENTRELATIVEPARSING?为什么所有这些操作都失败了?我认为任何PIDL至少是文件路径或CLSID,但是这个PIDL根本无法查询。

我知道有很多更好的解决方案可以访问FTP,但我对Shell32一般都有这个问题,而不是特别针对FTP。

我还通过 ILSaveToStream 将PIDL转换为字节,我可以看到该文件的名称​​肯定是

1 个答案:

答案 0 :(得分:1)

事实证明 IShellFolder :: EnumObjects 返回了相对PIDL。出于某种原因,虽然它们明确存储在 SHITEMID 中,但无法获取相对FTP PIDL的名称。

好吧,在文件夹和文件PIDL上调用 ILCombine 使一切都按预期工作。