很多的初学者会对com组件设计感到很迷茫,其实可以把理解简单化些。当然,你深入的理解它的设计原理和调用机制,还是有些复杂的。
但这些都有人做了,一般来说,我们不必过度关注。
先来看看,我们一般是怎么设计程序的。
首先定义一个接口(在自己的exe程序中都不怎么定义接口了,一来就一个类,呵呵,除非模块化,而这个模块以后可能会有变化):
//
这个接口有一个唯一标识的号码:518(我要发财)
class IDownloadObject
... {
public:
bool StartNetwork(unsigned short usPort) = 0;
bool Download(string & strUrl) = 0;
} ;
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)
... {
实现.....
}
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:
*p = new CFileDownload();
break;
case 529:
*p = 其他的类
break;
defualt:
break;
}
return (*p ! = NULL);
}
}
... {
public:
//创建一个类的对象
static bool CreateInstance(int iNO,void** pp)
...{
switch(iNO)
...{
case 528:
*p = new CFileDownload();
break;
case 529:
*p = 其他的类
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;
}
#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;
}
---------------------------------------------
#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:
*p = new CFileDownload();
break;
case 529:
*p = 其他的类
break;
defualt:
break;
}
return (*p == NULL);
}
}
-------------------------------------------
class CCreateObjct
... {
public:
//创建一个类的对象
static bool CreateInstance(int iNO,void** pp)
...{
switch(iNO)
...{
case 528:
*p = new CFileDownload();
break;
case 529:
*p = 其他的类
break;
defualt:
break;
}
return (*p == 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)
... {
实现.....
}
------------------------------------------------------
// 这个类有一个唯一标识这个接口的号码: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里面的一个类对象,
然后得到这个类对象的指针(经过向基类转换过的),然后高用函数,与我们平时调用自己的类没有什么多大的区别.
走了...嗯?谁扔的臭鸡蛋?