自实现COM机制

来源:互联网 发布:淘宝大c香港站货源正吗 编辑:程序博客网 时间:2024/04/29 23:08
COM的本质是组件化编程的思想。在windows编程中,系统的COM机制就是强制用组件思想编程的规定。 从进程内组件到进程外组件,从模块化编程到自动化组件。
非常多的windows系统功能都以COM组件的形式对外提供接口调用。而二进制级别的复用更体现了COM的优点。

使用COM的windows程序越来越多,虽然MFC库和ATL库都对COM进行了很好的支持,来方便开发者使用。而平时我们程序中用到COM都是一些比较基础的功能,很多复杂的功能
几乎用不到。而且很多项目都是用WTL库,所以为了COM机制引入ATL这些重量级库有点不划算。

所以就自己实现了一套COM机制,支持QueryInterface等基本功能,支持模块的引用计数,并且支持包容和聚合和智能指针,使用非常方便。
还有一点,这套COM机制不用注册,注册的本质是将COM组件的路径写到注册表固定位置,方便使用者找到组件。而我的COM机制,使用组件路径加类名的方法来加载组件,更方便。

使用时定义一个接口
#pragma once


struct __declspec(uuid("A52A1065-E186-4f4a-A7AA-C114E86C6E9E")) 
__declspec(novtable) ICommand : public IUnknown
{
/*
* 命令接口
* IUnknown : Ihtmldocument2接口
*/
STDMETHOD(Execute)(IUnknown* pUnknown, DWORD dwParam) PURE;
};




   在动态库中实现该接口
   class CCommandImpl : public CSComObjectRoot<CCommandImpl>, public ICommand
{
public:


BEGIN_COM_INTERFACE(CCommandImpl)
DECLARE_COM_INTERFACE(ICommand)
END_COM_INTERFACE()


//  impl IShopCommand
STDMETHOD(Execute)(IUnknown* pUnknown, DWORD dwParam){
return S_OK;
}
};

COM_SINGLETON_OBJ_AUTO(CCommandImpl)
// COM_SINGLETON_OBJ_AUTO宏是将该类作为COM类输出

然后找个stdafx.cpp文件加上DECLARE_COM_MODULE()宏,表示该组件是com组件

 这样组件就现实完成了。

现在看怎样使用组件:
使用起来非常方便:
#define CLSID_TUAN_GOU_SHOP_COMMAND_T("core.CCommandImpl")
CSPointer<ICommand> pTGCmd(CLSID_TUAN_GOU_SHOP_COMMAND);
if (pTGCmd)
pTGCmd->Execute(NULL, 0);

这样可以使用组件了,实现了智能指针,很方便。


github:https://github.com/pptt0617/SCOM

0 0
原创粉丝点击