如何简单的理解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里面的一个类对象,
然后得到这个类对象的指针(经过向基类转换过的),然后高用函数,与我们平时调用自己的类没有什么多大的区别.

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

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值