我正在为由文件夹和子文件夹组成的命名空间扩展实现一个基本文件夹对象(连接点是一个文件系统文件夹,它是空的)。我已经实现了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 显示上下文菜单(并且GetUIObjectOf
永远不会调用,即使IShellFolder:Initialize
使用正确的 PIDL 调用)。
在的相关部分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()));