使用BHO扩展Windows资源管理器

5

我正在尝试使用C ++扩展Windows资源管理器(而不是IE),并添加一个自定义面板,应该长这样:

enter image description here

这里有一个类似的问题(使用C#):

类似问题

这个问题是关于C#的,已经有了答案。

但是我认为答案有点太简略了,让我无法理解,以下是我所了解到的内容:

  1. 我需要实现一个BHO对象
  2. BHO对象应该实现IObjectWithSite和IDockingWindow接口
  3. 在SetSite方法中,调用QueryInterface来获取服务提供程序的指针,然后调用QueryService来获取停靠窗口框架的指针,最后调用AddToolBar添加自定义窗口。 这就是我迷失的地方

我的问题是:

  1. 我应该在什么时候创建我的自定义窗口?在对象初始化期间吗?
  2. 我认为在创建我的窗口之前,我应该获取父窗口的句柄(在我的情况下,我认为它应该是Windows资源管理器的句柄),我可以在哪里获取这个句柄?使用停靠窗口框架的指针吗?
  3. 我应该如何注册我的dll?我阅读了一些预览处理程序的示例代码,我们必须正确注册dll,才能被系统调用,对吗?

我已经尝试了几天来复制类似问题的解决方案,但到目前为止没有成功。

我真的很新于BHO和所有这些东西,请帮助我解决这个问题,谢谢。


3
BHO(浏览器辅助对象)很邪恶。BHO中的任何漏洞都会变成系统漏洞。因此,对于不确定COM技术细节的人,我建议不要去做(这样做一般来说也是我的建议)。 - Cheers and hth. - Alf
是的,我明白你的意思并且完全同意。但是不知何故我们的系统需要这样的功能,而且似乎是必不可少的,你是否知道除了BHO之外还有其他实现目的的方法呢?@Cheersandhth.-Alf - Sean
如果您想要对所选驱动器执行某些操作,请为驱动器的右键菜单注册一个处理程序。这非常简单。您的处理程序程序将驱动器作为命令行参数获取,用户可以在驱动器的右键菜单中看到它。 - Cheers and hth. - Alf
1
例如,将[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shell\say_ah]的默认值设置为“Say "Ah!"”,然后将[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shell\say_ah\command]的默认值设置为“cmd /k echo Ah! - %1”。运行良好。 - Cheers and hth. - Alf
3
阿尔夫说得很对——向你的管理层反馈,并让他们知道甚至微软也不鼓励这种做法。但如果你非要这样做,那就去订购一本 Dino 的书的任何二手拷贝:http://www.amazon.com/Visual-C-Windows-Shell-Programming/dp/1861001843/ref=sr_1_1?ie=UTF8&qid=1406456530&sr=8-1&keywords=dino+esposito+shell+programming 我认为这是有关该主题唯一写过的一本书。 - selbie
显示剩余2条评论
1个回答

1
对于这样的 Explorer 扩展,我创建了两个对象。第一个实现 BHO(IDispatch 和 IObjectWithSite)。第二个实现 IObjectWithSite、IOleWindow、IDockingWindow、IInputObject 和 IOleCommandTarget。
1)显示您的窗口的逻辑取决于您想要实现什么。
2)您可以在 Second.SetSite 中获取父窗口。
Site.QueryInterface(IDockingWindowSite, FDockingWindowSite);
FDockingWindowSite.GetWindow(FParent);

3)只需将您的BHO注册为标准BHO。

创建和调试此类扩展程序需要很长时间。如果您不是该领域的专家,请再次考虑-您真的需要这个功能吗?但是,如果您确实决定需要它,请首先尝试创建和注册简单的BHO。只有在BHO正常工作时才添加IDockingWindow实现。


哇,酷毙了!讲解非常好并且真的很快!我会尝试这个的!再次感谢你啊,老兄。 - Sean
经过长时间的搜索,我终于按照您的指示使它工作了。它现在可以正常运行。 - Sean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接