C++ COM 開發 Hello World V2

CalmReason發表於2016-06-27

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;
}

輸出:


相關文章