首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

[怎么简单的理解com组件]

2012-03-04 
[如何简单的理解com组件][如何简单的理解com组件]很多的初学者会对com组件设计感到很迷茫,其实可以把理解

[如何简单的理解com组件]
[如何简单的理解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:
*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;
}

====
完了,呵呵.
那对应到客户端程序和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:
*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)
{
实现.....
}
------------------------------------------------------

这样理解是不是简单些?

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

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

[解决办法]
OH,还需要考虑二进制兼容,位置透明性等。。。
[解决办法]
up
[解决办法]
呵呵,不错噢.
[解决办法]
up!
[解决办法]
可以看看COM本质论,第一章
[解决办法]
牛人,com我不会写但是会用呵呵
[解决办法]
lz,不错
[解决办法]
对于这类帖子,应该大大的鼓励加可能的奖励
[解决办法]
OH,简单的可以这样理解,不过COM规范比这更复杂,完整,严谨
1:比如以下接口
class IDownloadObject
{
public:
bool StartNetwork(unsigned short usPort) = 0;
bool Download(string & strUrl) = 0;
};
在Com中应该为
class IDownloadObject
{
public:
HRESULT _stdcall StartNetwork(unsigned short usPort,VARIANT_BOOL *bReturn) = 0;
HRESULT _stdcall Download(BSTR strUrl,VARIANT_BOOL *bReturn) = 0;
};
它规定了调用约定_stdcall,字符串为BSTR,这样在不同的语言环境里才不问题,比如VC做的
Dll在VB或C++ Builder里调用,有可能默认调用约定不一样,不加_stdcall则有可能程序就和会崩溃,同样VB里就没有String 的数据类型等。
所以为了做到在不同的语言环境中调用都是二进制兼容的,还是要严格按照COM规范做的。
当然如果做的东西是VC做,又是VC调用,就无所谓了。


[解决办法]
还有,比如为了在脚本环境中使用,则应实现IDispatch接口等。
[解决办法]
强 不懂COM 还会用
[解决办法]
喜欢这类贴子,鼓励下哦、、、
[解决办法]
多谢楼主
[解决办法]
支持.
[解决办法]
学习
[解决办法]
好帖应该支持的
其实好多技术都是已有的原理披上一层新的外衣而已
[解决办法]
不错,简单易懂,学习~~~~
[解决办法]
顶,基本也就这么些东西
------解决方案--------------------


顶~~~~~

热点排行