在Windows命名空间扩展中打开子子文件夹

时间:2013-09-15 00:09:51

标签: winapi com windows-shell shell-extensions

我为由文件夹和子文件夹组成的命名空间扩展实现了一个基本文件夹对象(连接点是一个文件系统文件夹,它是空的)。我已实施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()));

0 个答案:

没有答案