Winapi FTP PIDL的ShGetNameFromIdle列表失败

Winapi FTP PIDL的ShGetNameFromIdle列表失败,winapi,com,shell32,Winapi,Com,Shell32,如果我在Windows上添加FTP网络位置,它将创建一个指向该位置的.lnk文件。如果我通过IShellLink打开链接,获取其IShellFile目标并将其绑定到IShellFolder,我可以使用IShellFolder::EnumObjects枚举远程位置(登录后)上的文件,并返回正确的文件 但是,如果我试图通过SHGetNameFromIDList或IShellItem::GetDisplayName获取其中任何文件的名称,则函数将失败,并返回0x80070057(无效参数)HRESUL

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

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

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

我知道有很多更好的访问FTP的解决方案,但我对Shell32的问题是一般的,而不是FTP

我还通过ILSaveToStream将PIDL转换为字节,我可以看到文件名肯定在那里。

结果是IShellFolder::EnumObjects返回了相对PIDL。由于某些原因,无法获得相对FTP PIDL的名称,尽管它们清楚地存储在SHITEMID中


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

表明
SIGDN_DESKTOPABSOLUTEPARSING
应该可以工作。@zett42遗憾的是,这也失败了,并出现了相同的错误。这里清楚地记录了这一点:“数组中返回的itemiList结构与正在枚举的IShellFolder相关。”。PIDL是100%不透明的,它们可以包含任何内容,而不仅仅是名称、路径或CLSID。因此,如果要使用SHGetPathFromIDList等静态方法,则必须将EnumObjects返回的内容与文件夹的绝对pidl相结合。但是,IShellFolder::GetDisplayNameOf应与相对PIDL一起使用(不要与IShellItem混淆)