【问题标题】:SHOpenFolderAndSelectItems for explorer replacement programSHOpenFolderAndSelectItems 用于资源管理器替换程序
【发布时间】:2014-04-02 20:12:18
【问题描述】:

我维护了一个资源管理器/文件管理器工具 (xplorer2),它可以代替 Windows 资源管理器来打开文件夹。但是我无法捕获 SHOpenFolderAndSelectItems API 执行的“打开文件夹并选择项目”操作。

我发现其他文件管理器程序员的old thread 暗示正确的方法是将“explorer-like”工具注册为 shell 窗口,然后响应一些查询以提供接口和服务,如 IWebBrowserApp允许选择项目

我成功地在 shell 窗口中注册了我的顶级窗口

CComPtr<IShellWindows> pShellWindows;
HRESULT hr = pShellWindows.CoCreateInstance(CLSID_ShellWindows);
hr = pShellWindows->Register(static_cast<IDispatch*>(this),
    (SHANDLE_PTR)hwTop, /*SWC_3RDPARTY*/SWC_EXPLORER, &m_dwCookie);
ATLASSERT(SUCCEEDED(hr));

如果在 shell 窗口中枚举,窗口确实会出现。但是,当它作为 SHOpenFolderAndSelectItems 的结果启动时(它在 HKEY_CLASSES_ROOT\Directory\shell 中声明为资源管理器替换),不会尝试 QueryInterface 或注册 IDispatch 上的任何其他操作。我已经尝试了 SWC_3RDPARTY 和 SWC_EXPLORER 注册标志,但没有任何运气

任何想法我做错了什么?

【问题讨论】:

  • 好的,所以我一定是敲错门了,因为那个“其他文件管理器”甚至没有注册一个 shell 窗口,但仍然很好地处理 SHOpenFolderAndSelectItems...
  • 好的,现在我正在考虑将 DDE 视为一种可能性,您至少能告诉我是否要在这个已不复存在的主题上再浪费一周时间吗?我的意思是,如果不是 DDE,那就这么说吧。有一项很好的运动! :)
  • DDE 绝对不是它。
  • 谢谢!经过仔细检查,我发现您毕竟确实注册了一个 shell 窗口......我想我会采用 DelegateExecute 方式
  • 所以现在我有一个 COM 服务器,遗憾的是,DelegateExecute 只传递了主文件夹名称而没有选择。因此,它不会为 DDE 或任何其他遗留机制添加任何内容。让我们看看我还要在这上面浪费多少时间……

标签: c++ atl windows-shell


【解决方案1】:

好的,我想通了。诀窍真的是绕过buggy documentation

【讨论】:

  • 调用 RegisterPending 时使用了哪个 PIDL?一个空的pidl? VT_EMPTY?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 2010-12-09
  • 2012-01-07
  • 1970-01-01
  • 2023-03-22
  • 2012-05-23
相关资源
最近更新 更多