编写可复用性更好的C++代码:Band对象和COMToys(4)
2006-07-21 11:46:12 来源:WEB开发网编写工具栏Band很容易。只要对info/comm类型的Band进行专门注册就可以了;将Band类ID(GUID)作为串添加到HKEY_LOCAL_MACHINE\Software\ Microsoft\Internet Explorer\Toolbar下面。我已经修改了BandObj.rgs文件来添加这个值,文件名字叫ExplrBar.rgs。然后将这个文件作为资源添加到工程的MyBands.rc文件中。
IDR_COMMBAND REGISTRY DISCARDABLE "ExplrBar.rgs"
在使用工具栏Band时有一个问题。当你在资源管理器中单击右键显示这个Band的时候,它有一个"电台"菜单项。实际上,它是第一个注册的工具栏Band的名字。这是一个已知的bug——参见微软知识库文章Q231621。Windows 2000好像已经解决了这个问题。
再谈MyBands
我想,现在你一定有点厌恶Band对象了,并希望它从此从你的生命中消失掉。真是个好主意!对于我来说,反正我已经把所有关于Band对象的东西全都告诉你了。在我走之前,请让我再说说MyBands——实际实现Band的部分。它很简单,但有些东西值得一提。
首先,CMyCommBand和CMyInfoBand都是从一个公共基类CMyIEBand派生而来的。CMyIEBand实现了一个公共特性:即当你在Band上单击鼠标时,它给浏览器发送VC知识库主页和新浪主页。为了实现这个功能,此Band对象需要IWebBrowser2接口,以便对象能调用IWebBrowser2::Navigate函数,让Web浏览器知道访问什么地方。显然,这需要一点诀窍,所以我首先想到编写: CComQIPtr iwb = m_pSite;
它当然要用QueryInterface来查询IWebBrowser2接口,但QueryInterface的调用以E_NOINTERFACE错误和一个空指针而告终。容器不实现IWebBrowser2接口。那么到哪里去获得这个接口呢?请看下面这些你必须掌握的编程代码: CComQIPtr sp = m_pSite;
IServiceProvider是一个用于COM对象的通用方法,通过它来提供它所知道的由其它对象实现的接口。初看起来它有点像QueryInterface,但又不完全是那样:容器本身不实现IWebBrowser2接口,但是容器知道如何去获得它的一个对象。
m_spWebBrowser2 = NULL;
if (sp) {
sp->QueryService(IID_IWebBrowserApp,
IID_IWebBrowser2,
(void**)&m_spWebBrowser2);
}
更多精彩
赞助商链接