C++ COM 开发 Hello World V2

COM的历史与ATL

下面的示例程序来自:《COM+技术内幕》

所得:

组件的目标:
  • 语言无关(发布的时候必须是二进制的,编译链接好的),这样才能在市场中存活下来,使得语言的流行不会冲击应用程序。
  • 升级不影响客户的正常使用
  • 远程组件与位置无关,必须像本地组件一样使用
  • 新老版本兼容:

组件的需求:
  • 动态链接:如果不能动态链接,就无法升级,就不能在用户使用的过程中将程序替换掉。
  • 信息封装:只要接口不变化,双方组件发生了变化都不会影响对方。反之,只要接口变了,另一方为了适应必须要做出被动的调整。

接口的设计:
  • 接口的设计者要有预测未来的能力,这对大多数人来说都是很困难的。

各种接口:
  • DLL接口:导出函数
  • C++接口:抽象基类的成员函数,变为COM接口需要继承IUnknown接口
  • COM接口:接口就是一切

interface接口:
interface接口在ObjBase.h中被定义如下:
#define __STRUCT__ struct
#define interface __STRUCT__


com开发示例程序

主要为了展示最基本的com开发示例程序,略见一斑。

工程百度云下载:http://pan.baidu.com/s/1qYSrXtM

源代码:

#include <iostream>
using namespace std;
#include <ObjBase.h>

void trace(const char* pMsg)
{
	cout<< pMsg<<endl;
}

interface IX
{
	virtual void __stdcall Fx1(void) = 0;
	virtual void __stdcall Fx2(void) = 0;
};

interface IY
{
	virtual void __stdcall Fy1(void) = 0;
	virtual void __stdcall Fy2(void) = 0;
};

class CA : public IX , public IY
{
public:
	virtual void __stdcall Fx1() { cout<<"CA::Fx1()"<<endl;}
	virtual void __stdcall Fx2() { cout<<"CA::Fx2()"<<endl;}
	virtual void __stdcall Fy1() { cout<<"CA::Fy1()"<<endl;}
	virtual void __stdcall Fy2() { cout<<"CA::Fy2()"<<endl;}

};

int main()
{
	trace("client: create an instance of the component.");
	CA* pA = new CA;

	trace("client: use the IX interface.");
	IX* pIX = pA;
	pIX->Fx1();
	pIX->Fx2();

	trace("client: use the IY interface.");
	IY* pIY = pA;
	pIY->Fy1();
	pIY->Fy2();

	trace("client: delete the component.");
	delete pA;
}

输出:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值