现在的位置: 首页 > 综合 > 正文

COM技术内幕学习心得

2013年10月16日 ⁄ 综合 ⁄ 共 3647字 ⁄ 字号 评论关闭




1: COM

技术内幕学习笔记


COM
基础实现方式(
方式
1

-

第一、二章

使用
CreateInstance

QueryInterface
实现的
COM

(方式
2

-
第三章

加入引用计数
(
方式三
) -
第四章

#include
"stdafx.h"

#include
"iostream.h"

 

#include
<objbase.h>

 

interface
IX

{

      
virtual void FX1()=0;

};

 

interface
IY

{

      
virtual void FY1()=0;

};

 

class
CA : public IX, public IY

{

public:

      
BOOL _QueryInterface(const ID, void
**pV);

 

   
virtual void FX1()

      
{

      
      
cout<<"FX1()"<<endl;

      
}

      

      
virtual void FY1()

      
{

      
      
cout<<"FY1()"<<endl;

      
}

 

};

 

int
main(int argc, char* argv[])

{

      
CA *pA = new CA();

   

      
IX *pX = pA;

   
pX->FX1();

 

      
IY *pY = pA;

   
pY->FY1();

 

      
delete pA;

   

      
return 0;

}

#include
"stdafx.h"

#include
"iostream.h"

 

#include
<objbase.h>

 

class
CUnknown

{

public:

      
virtual BOOL _QueryInterface(const ID,
void **pV) = 0;

};

 

class
IX : public CUnknown

{

public:

      
virtual void FX1()=0;

};

 

class
IY : public CUnknown

{

public:

      
virtual void FY1()=0;

};

 

class
CA : public IX, public IY

{

public:

      
BOOL _QueryInterface(const ID, void
**pV);

 

   
virtual void FX1()

      
{

             
cout<<"FX1()"<<endl;

      
}

      

      
virtual void FY1()

      
{

             
cout<<"FY1()"<<endl;

      
}

 

};

 

enum
{IID_IX, IID_IY};

BOOL
CA::_QueryInterface(const ID, void **pV)

{

      
if (ID == IID_IX)

      
{

             
*pV = static_cast<IX
*>(this);

             

             
return TRUE;

      
}

      
else if (ID == IID_IY)

      
{

             
*pV = static_cast<IY
*>(this);

             

             
return TRUE;

      
}

 

      
return FALSE;

}

 

CUnknown*
CreateInstance()

{

      
CUnknown *pI = static_cast<IX
*>(new CA());

      

      
return pI;

}

 

int
main(int argc, char* argv[])

{

      
CUnknown *pUnknown = CreateInstance();

   

      
IX *pX = NULL;

      
pUnknown->_QueryInterface(IID_IX,
(void **)&pX);

      
pX->FX1();

 

   
IY *pY = NULL;

   
pX->_QueryInterface(IID_IY, (void
**)&pY);

   
pY->FY1();

 

      
delete pUnknown;

 

      
return 0;

}

#include
"stdafx.h"

#include "iostream.h"

 

#include
<objbase.h>

 

class CUnknown

{

public:

      
virtual BOOL _QueryInterface(const ID,
void **pV) = 0;

      
virtual void _AddRef() = 0;

      
virtual void _Release() = 0;

};

 

class IX : public
CUnknown

{

public:

      
virtual void FX1()=0;

};

 

class IY : public
CUnknown

{

public:

      
virtual void FY1()=0;

};

 

class CA : public IX,
public IY

{

public:

      
CA();

      
virtual ~CA();

 

public:

      
virtual BOOL _QueryInterface(const ID,
void **pV);

      
virtual void _AddRef();

      
virtual void _Release();

 

   
virtual void FX1()

      
{

             
cout<<"FX1()"<<endl;

      
}

      

      
virtual void FY1()

      
{

             
cout<<"FY1()"<<endl;

      
}

 

private:  

      
int m_nRef;

};

 

enum {IID_IX, IID_IY};

BOOL
CA::_QueryInterface(const ID, void **pV)

{

      
BOOL bReturn = FALSE;

      

      
if (ID == IID_IX)

      
{

             
*pV = static_cast<IX
*>(this);

             
bReturn = TRUE;

      
}

      
else if (ID == IID_IY)

      
{

             
*pV = static_cast<IY
*>(this);

             
bReturn = TRUE;

      
}

   
if (*pV != NULL)

      
  

static_cast<CUnknown *>(*pV)->_AddRef();

      

      
return (bReturn) ? TRUE : FALSE;

}

 

void CA::_AddRef()

{

      
++m_nRef;

}

 

void CA::_Release()

{

      
if (--m_nRef == 0)

      
{

             
delete this;

      
}

}

 

CA::CA()

{

      
m_nRef = 0;

}

 

CA::~CA()

{

}

 

CUnknown*
CreateInstance()

{

      
CUnknown *pI = static_cast<IX
*>(new CA);

      
pI->_AddRef();

 

      
return pI;

}

 

int main(int argc,
char* argv[])

{

      
CUnknown *pUnknown = CreateInstance();

   

      
IX *pX = NULL;

      
pUnknown->_QueryInterface(IID_IX,
(void **)&pX);

      
pX->FX1();

      
pX->_Release();

 

      
IY *pY = NULL;

   
pX->_QueryInterface(IID_IY, (void
**)&pY);

   
pY->FY1();

      
pY->_Release();

   

      
pUnknown->_Release();

 

      
return 0;

}

结论:

   
1


COM
接口在
c++
中是用纯抽象基类来实现的

2
:一个
COM
组件可以提供多个接口

3

C+
+类通过多重继承来实现提供多接口组件

 

不足之处:

1
:客户,组件之间通过接口通信来实现没有突出。

2
:客户端要使用到组件的声明(
new CA()

结论:

   
1

:通过使用
CreateInstance
来摆脱组件类声明

      

(
使用不再使用指向
CA
的指针
)

2
:可以看出客户,组件通过接口通信的锥形

 

不足之处:

1
:没有添加引用计数及释放引用计数

结论
:
(
在方式二的基础上
)

   
1:

通过使用引用计数来完成删除组件方法

 

动态连接
(

方式四

)


第五章


抱歉!评论已关闭.