WEB开发网
开发学院软件开发VC 理解COM编程中的“种类”(Category)概念 阅读

理解COM编程中的“种类”(Category)概念

 2006-07-21 11:42:52 来源:WEB开发网   
核心提示: COM的技术机制实际上就这么几招,即使是使用ATL智能指针也是如此,理解COM编程中的“种类”(Category)概念(6),我把这几招COM编程技术都封装在一个辅助类CCatIterator中,以便使用起来方便一些,Insertable键是个遗留下来的东西,对于要在16位应用插入32位对

COM的技术机制实际上就这么几招。即使是使用ATL智能指针也是如此,我把这几招COM编程技术都封装在一个辅助类CCatIterator中,以便使用起来方便一些。有了CcatIterator辅助类,要做的事情很简单:

CATEGORYINFO catinfo;
CCatIterator it;
while (it.Next(catinfo)) {
  // add catinfo to list
}

CLeftView::PopulateCategoryList用CCatIterator类以名字和每个种类的CATID构造列表视图。每次调用Next来将下一个种类的信息填入catinfo。在这里请记住我的一些经验之谈,在进行COM编程时,做好是编写一些自己的小型辅助类以免去处理那些头疼的HRESULTs和接口指针,尖括弧以及Release操作。我是个唯美主义者,要求自己的代码不仅要正确运行,还要求好看。

一旦具备了CATID,就可以用ICatInformation来得到实现种类的COM类清单。例如,实现CATID_AcmePlugin的所有控件。其中最关键的部分是ICatInformation::EnumClassesOfCategories以及枚举器IEnumCLSID。同样我也写了一个类来封装这些东西。

CLSID clsid;
CCatClassIterator it(&catid, 1);
while (it.Next(clsid)) {
  // add clsid to list
}

与ICatInformation::EnumClassesOfCategories类似,CCatClassIterator可以使你指定多个实现的种类。如“查找所有AcmePlugin和Blue Insertable Thingies 控件”。在这种情况下,要传递一个包含两个CATIDs的数组。你还能指定一个或多个必须的种类来查找需要一个或多个给定的控件。通过缺省值NULL,CCatClassIterator隐藏了所有额外的参数。

以上内容讨论了COM技术中对种类的编程。下面将谈谈CatView的其余部分,它与Windows及其MFC有关。CatView是一个文档/视结构的应用,但CDummyDoc只是为MFC而存在的。CMainFrame::OnCreateClient创建由窗格并在执行了通常的CframeWnd之后与左边窗格关联起来。在程序中唯有CLeftView::OnWinMgr是比较特殊的东西,它通过添加列宽来报告列表视图画面的TOFIT尺寸。(有关WinMgr和TOFIT的内容,请参见另外一篇文章:“创建一个随心所欲定制窗口尺寸的类”)。

本文附带的CatView例子可以从文章开始处的链接下载。编译后可以在自己的机器上运行,以观察机器上注册的种类。你会注意到一些晦涩难董的种类(如Visual InterDev Web Site Wizards)以及一些通用的控件,自动化对象和可插入种类。从COM的历史看,可插入种类是整个种类概念的祖先。回溯到早期,Visual Basic需要某种方式来获得哪个对象能被插入表单(forms),不用实例化每一个在注册表中的类来查找(QueryInterface)IOleInPlaceObject接口。解决方法是添加一个专门的键值,HKCR\CLSID\{CLSID}\Insertable,它告诉Visual Basic 类是可插入的(insertable)。后来微软扩展了这个机制变成更一般的概念,它就是我们在这里所说的种类。今天,Insertable键是个遗留下来的东西,对于要在16位应用插入32位对象,Insertable键是必不可少的。

上一页  1 2 3 4 5 6 

Tags:理解 COM 编程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接