2011-04-22 474 views
0

我有一个在HKCR \ Folder \ shellex \ DragDropHandlers下注册的shell扩展,我需要调用目标文件夹上的GetVolumePathName()+ GetVolumeInformation()(传递给您的PIDL在IShellExtInit::Initialize中)DragDropHandlers IShellExtInit :: Initialize和NETHOOD UNC路径

问题是,当某些东西被放在“Nethood快捷方式”(My Network Places\sharename)上时,传递给Initialize的PIDL指的是Nethood快捷方式,而不是UNC路径! (呼叫SHGetPathFromIDList在PIDL返回"%USERPROFILE%\NetHood\SHARE on MACHINE",而不是像"\\MACHINE\SHARE"你所期望的)

我也尝试创建PIDL的的IShellItem和调用的IShellItem :: GetDisplayName各种SIGDN值,但它们都没有返回的UNC路径。

如何从此PIDL获取UNC路径?

+0

AFAIR这些是包含'desktop.ini'和'target.lnk'的文件夹。你应该解决文件夹中的'target.lnk'。 – 2011-04-22 09:16:20

+0

是的,我知道他们包含这些文件,但我自己解决这些文件不能是正确的方法来做到这一点。 target.lnk是处理nethood文件夹的IShellFolder的实现细节。 – Anders 2011-04-22 09:35:55

回答

1
// error checking omitted 
IShellFolder* pFolder = NULL; 
LPCITEMIDLIST pidlChild = NULL; 
hr = SHBindToParent(pidl, IID_IShellFolder, (void**)&pFolder, &pidlChild); 
SFGAOF Attributes = SFGAO_LINK; 
hr = pFolder->GetAttributesOf(1, &pidlChild, &Attributes); 
if(Attributes & SFGAO_LINK) 
{ 
    // item is a link; get it's target path 
    IShellLink* pLink = NULL; 
    hr = pFolder->GetUIObjectOf(NULL, 1, &pidlChild, IID_IShellLink, NULL, (void**)&pLink); 
    TCHAR szPath[MAX_PATH]; 
    hr = pLink->GetPath(szPath, MAX_PATH, NULL, 0); // szPath now contains path of UNC share 
    pLink->Release(); 
    pLink = NULL; 
} 
pFolder->Release(); 
pFolder = NULL; 
+0

编辑:GetAttributesOf的SFGAOF参数是输入和输出,我猜SFGAO_LINK是一个缓存标志,你很幸运;) – Anders 2011-04-22 20:11:08

+0

我怀疑有多种方式来剥皮这只猫,可能通过使用IPersistFolder3 :: GetFolderTargetInfo()或SHGetDataFromIDList SHGDFIL_NETRESOURCE),但我会接受这个答案,除非有人提出更好的(和/或有文件记录的)方法... – Anders 2011-04-22 20:47:44

+0

好的捕获;如果您传递0,可能会返回所有属性,尽管这没有记录。至于其他方法,我会坚持这一点,因为它更通用。 – Luke 2011-04-23 12:02:59