如何简单的理解com组件

很多的初学者会对com组件设计感到很迷茫,其实可以把理解简单化些。当然,你深入的理解它的设计原理和调用机制,还是有些复杂的。
 但这些都有人做了,一般来说,我们不必过度关注。
  先来看看,我们一般是怎么设计程序的。
  首先定义一个接口(在自己的exe程序中都不怎么定义接口了,一来就一个类,呵呵,除非模块化,而这个模块以后可能会有变化):

 

// 这个接口有一个唯一标识的号码:518(我要发财)
class  IDownloadObject
{
public:
 
bool StartNetwork(unsigned short usPort) = 0;
 
bool Download(string & strUrl) = 0;
}
;

 

然后派生我们的下载类(.h):

#include  " IDownloadObject "
class  CFileDownload :  public  IDownloadObject
{
public:
 
bool StartNetwork(unsigned short usPort);
 
bool Download(string & strUrl); 
}
;
(.pp)
bool  CFileDownload::StartNetwork(unsigned  short  usPort)
{
 实现.....
}

bool  CFileDownload:Download( string   &  strUrl)
{
 实现.....
}

 

ok了,我们再加一个类专门new各类的对象

class  CCreateObjct
{
public:
 
//创建一个类的对象
 static bool CreateInstance(int iNO,void** pp)
 
{
  
switch(iNO)
  
{
  
case 528:
   
*= new CFileDownload();
   
break;
  
case 529:
   
*= 其他的类
   
break;
  defualt:
   
break;
   
  }

  
return (*p !
= NULL);
 }

}

好啦,我们的类设计完了,我们要开始构造调用了

#include  " FileDownload.h "
#include 
" MgrPtr "
int  main( int  argc,  char   * a[])
{
 IDownload 
* pIDn = NULL;  //定义接口指针
 CCtreaeObject::CreateInstance(518,&pIDn);
 
if(pIDn)
 
{//ok,得到一个接口指针了,就是CFileDownload的指针,向上转换了
  if(pIDn->Network(8888))
  
{
   
string strUrl = "bt://xxxx/xxxx";
   pIDn
->Download(strUrl);
  }

 }

 
return 0;
}

 

====
完了,呵呵.
那对应到客户端程序和com组件中来,我们写的这些类应该各在什么位置呢?

这个是我们客户端程序的代码:

 

--------------------------------------
#include 
" FileDownload.h "     // 这里相当于导入com的接口描述
#include  " MgrPtr "             // 这里相当于加载com库(CoInitialize),让我们可以方便的调用和管理com组件
int  main( int  argc,  char   * a[])
{
 IDownload 
* pIDn = NULL;  //定义接口指针
 CCtreaeObject::CreateInstance(518,&pIDn);
 
if(pIDn)
 
{//ok,得到一个接口指针了,就是CFileDownload的指针,向上转换了
  if(pIDn->Network(8888))
  
{
   
string strUrl = "bt://xxxx/xxxx";
   pIDn
->Download(strUrl);
  }

 }

 
return 0;
}

---------------------------------------------


这个相对于com库的api:CoCreateInstance
只是它实现了更复杂的东东,比如查询注册表,加载com组件,得到类厂接口....

--------------------------------------------
class  CCreateObjct
{
public:
 
//创建一个类的对象
 static bool CreateInstance(int iNO,void** pp)
 
{
  
switch(iNO)
  
{
  
case 528:
   
*= new CFileDownload();
   
break;
  
case 529:
   
*= 其他的类
   
break;
  defualt:
   
break;
   
  }

  
return (*== NULL);
 }

}

-------------------------------------------

 

这就是我们写的com组件了

-----------------------------------------------------
// 这个类有一个唯一标识这个接口的号码:518
class  IDownloadObject
{
public:
 
bool StartNetwork(unsigned short usPort) = 0;
 
bool Download(string & strUrl) = 0;
}
;

然后派生我们的下载类(.h):
#include 
" IDownloadObject "
class  CFileDownload :  public  IDownloadObject
{
public:
 
bool StartNetwork(unsigned short usPort);
 
bool Download(string & strUrl); 
}
;
(.pp)
bool  CFileDownload::StartNetwork(unsigned  short  usPort)
{
 实现.....
}

bool  CFileDownload:Download( string   &  strUrl)
{
 实现.....
}

------------------------------------------------------

 

这样理解是不是简单些?

以上代码是信手写来,没调试运行过.....也不知道写这些东东对一些人有没有用
反正大家就把com组件当成完成某个功能的类的集合,我们要调用什么类的功能时,就new里面的一个类对象,
然后得到这个类对象的指针(经过向基类转换过的),然后高用函数,与我们平时调用自己的类没有什么多大的区别.

走了...嗯?谁扔的臭鸡蛋?

 
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页