自实现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);
非常多的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
- 自实现COM机制
- 用C模拟实现COM机制
- COM机制
- jquery实现广告伸缩效果(转自www.jqueryba.com)
- Nginx + GridFS 实现的缩略图处理机制 « weberliu.com
- 利用文件锁机制实现服务器程序的自启动
- VS2010自带CMemDC轻松实现双缓冲机制
- 基于Java自带同步机制实现生产者-消费者模式
- Golang自玩项目中一个重连机制实现.
- com 自注册 文件
- asp.net的postback机制 (转自http://www.cnblogs.com/KenBlove/archive/2008/11/06/1328238.html)
- linux信号机制分析(转自http://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html)
- Android ListView与RecyclerView对比浅析--缓存机制<转载自http://dev.qq.com/topic/5811d3e3ab10c62013697408>
- 合并实现DataGrid多表头 (转自:http://singlepine.cnblogs.com/articles/282990.html)
- asp.net进度条的实现(本文转自http://suntears.cnblogs.com)
- VC++实现Contourlet图像处理[转载自http://blog.sina.com.cn/aclon]支持原创
- Asp.NET 的Session实现原理 转自21kaiyun.com
- jquery实现鼠标移动出现提示信息(转自www.jqueryba.com)
- 行为型模式11之4-Chain of Responsibility责任链模式例子理解
- 基础概念1
- 交叉销售功能介绍-功能
- 网络的理解
- 【CSS3】变形--位移 translate()
- 自实现COM机制
- 图片数组的互相转换
- 关于mysql对字符串的数字的排序
- 总结及梳理 : Fragment
- shell遍历当前目录下的文件,用去掉文件后缀的字符串替换文件中的文本
- Wireshark抓包Https
- UITextField限制输入长度
- APP是什么? 为什么叫APP APP全称是什么
- 行人检测资料总结2016.2.24