理解COM编程中的“种类”(Category)概念
2006-07-21 11:42:52 来源:WEB开发网catinfo.catid = CATID_AcmePlugin;
catinfo.lcid = 0x0409; // locale=english
USES_CONVERSION; // uses A2W
wcscpy(catinfo.szDescription,
A2W("My Acme Plugin."));
pcr->RegisterCategories(1, &catinfo);
接下来的任务是如何告诉COM你的COM类是Acme Plugin。ICatRegister也有相应的方法来做这件事情,它就是RegisterClassImplCategories。
// 也是在DllRegisterServer中
CATID catid = CATID_AcmePlugin;
pcr->RegisterClassImplCategories(
CLSID_MyPluginObj, 1, &catid);
这样就注册了你的COM类,实现种类CATID_AcmePlugin。是不是很简单啊!这些都是此类编程的套路。ICatRegister将有关哪个类实现哪个种类的信息放入注册表,以便Windows能快速读到它,而不用像你最开始所做的那样去实例化每一个组件来查找IMyAcmePlugin接口。
与种类的注册类似,ICatRegister也有用注销种类的方法,这两个方法对于种类而言都是必须的(相对于实现而言),也就是说,你的COM类需要其容器来实现那些种类。当你的组件需要专门的回调接口时,就必须实现种类。下面是完整的ICatRrgister接口:
//
ICatRegister
////////////////////////////////////////////////////////////////
// ICatRegister interface, edited from comcat.h
//
class ICatRegister : public IUnknown {
public:
virtual HRESULT RegisterCategories(
ULONG cCategories, // number of categories to register
CATEGORYINFO rgCategoryInfo[]); // info for each one
virtual HRESULT UnRegisterCategories(
ULONG cCategories, // number of categories to unregister
CATID rgcatid[]); // their CATIDs
virtual HRESULT RegisterClassImplCategories(
REFCLSID rclsid, // COM class ID
ULONG cCategories, // number of categories it implements
CATID rgcatid[]); // their CATIDs
virtual HRESULT UnRegisterClassImplCategories(
REFCLSID rclsid, // COM class ID
ULONG cCategories, // num implemented categories to unreg
CATID rgcatid[]); // their CATIDs
virtual HRESULT RegisterClassReqCategories(
REFCLSID rclsid, // COM class ID
ULONG cCategories, // number of categories it requires
CATID rgcatid[]); // required CATIDs
virtual HRESULT UnRegisterClassReqCategories(
REFCLSID rclsid, // COM class ID
ULONG cCategories, // number of req''''d categories to unreg
CATID rgcatid[]); // CATIDs to unregister
};
//
更多精彩
赞助商链接