我为由文件夹和子文件夹组成的命名空间扩展实现了一个基本文件夹对象(连接点是一个文件系统文件夹,它是空的)。我已实施IShellFolder
,并支持在IContextMenu
中返回ShellFolderImpl::GetUIObjectOf
。
假设我有以下文件夹(其中A和A \ B是"虚拟"由IShellFolder::EnumObjects
制作的文件夹)
C:\test.{74660590-4BEF-4BF4-9C85-5FAE0E084926}
C:\test.{74660590-4BEF-4BF4-9C85-5FAE0E084926}\A
C:\test.{74660590-4BEF-4BF4-9C85-5FAE0E084926}\A\B
我可以打开C:\test.{74660590-4BEF-4BF4-9C85-5FAE0E084926}
,并列出文件夹A.当我在文件夹A上双击(或从上下文菜单中选择打开)时,将打开该文件夹并列出子文件夹B在视图中。
问题:这仅适用于C:\test.{74660590-4BEF-4BF4-9C85-5FAE0E084926}
下的文件夹。 子文件夹B不显示上下文菜单(即使使用正确的PIDL调用GetUIObjectOf
,也永远不会调用IShellFolder:Initialize
。
在IContextMenu::InvokeCommand
的相关部分中,我通过执行
SHELLEXECUTEINFO sei = { 0 };
sei.cbSize = sizeof(sei);
sei.fMask = SEE_MASK_IDLIST | SEE_MASK_CLASSNAME;
sei.lpIDList = pidl; // the fully qualified PIDL
sei.lpClass = TEXT("folder");
sei.hwnd = pcmi->hwnd;
sei.nShow = pcmi->nShow;
sei.lpVerb = cmd.verb.w_str();
BOOL bRes = ::ShellExecuteEx(&sei);
DeletePidl(pidl);
return bRes?S_OK:HR(HRESULT_FROM_WIN32(GetLastError()));