• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > [如何简单的理解com组件]

[如何简单的理解com组件]

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了com组件,com组件是什么,com组件下载,com组件注册,com组件编程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.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里面的一个类对象,
然后得到这个类对象的指针(经过向基类转换过的),然后高用函数,与我们平时调用自己的类没有什么多大的区别.
走了...嗯?谁扔的臭鸡蛋?


解决方案1:

顶~~~~~

解决方案2:

顶,基本也就这么些东西

解决方案3:

不错,简单易懂,学习~~~~

解决方案4:

好帖应该支持的
其实好多技术都是已有的原理披上一层新的外衣而已

解决方案5:

支持.

解决方案6:

多谢楼主

解决方案7:

喜欢这类贴子,鼓励下哦、、、

解决方案8:

强 不懂COM 还会用

解决方案9:

牛人,com我不会写但是会用呵呵

解决方案10:

学习

解决方案11:

还有,比如为了在脚本环境中使用,则应实现IDispatch接口等。

解决方案12:

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调用,就无所谓了。

解决方案13:

对于这类帖子,应该大大的鼓励加可能的奖励

解决方案14:

lz,不错

解决方案15:

可以看看COM本质论,第一章

解决方案16:

up!

解决方案17:

呵呵,不错噢.

解决方案18:

up

解决方案19:

OH,还需要考虑二进制兼容,位置透明性等。。。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • COM组件的变量问题?
  • DLL中对进程外的ActiveX/COM组件(EXE形式)的对象实例化问题,DLL内不支持调进程外COM??
  • 怎样将原来不支持COM的mfc类,成为com类
  • MFC实现COM的接口映射的问题。请教高手。急。。
  • COM+组件的注册问题?
  • 关于COM组件的问题
  • com组件全局变量问题
  • COM组件和主程序之间的数据传输问题??
  • MFC中添加服务器组件的注册问题。
  • Com组件使用Recordset的游标问题

相关文章

  • 2017-06-04 vc用ole调用word,excel时如何屏蔽“服务器正在运行中”的对话框?
  • 2017-06-04 接口下定义的方法,[out]型参数在编译时出错,怎么解决?
  • 2017-06-05 关于IE工具条高分求助!!!
  • 2017-06-05 如何建立一个DLL
  • 2017-06-04 关于Com编程中的#Import指令的使用
  • 2017-06-05 获取Chart控件Label的Item并设置label,有原链接有分,有分!!急急急!!!!!!!!!!!!!!!!!
  • 2017-06-04 vc读EXCEL任意给定一个值怎么获取该值所在的列
  • 2017-06-04 VC6环境中在非对话框中动态创建activex控件出现的问题,不知道各位有没有碰到过,急啊
  • 2017-06-04 VC怎么做树形列表框,有教程吗?求视频教程地址
  • 2017-06-05 急求!!如何在vc浏览器中用ChtmlView实现添加收藏夹和整理收藏夹?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 如何让一个控件支持CCmdTarget类,
    • 为什么用MFCAppWizarddll建立的CPP文件里没有DllMain函数?
    • 如何在VC2005里建一个dll工程?
    • HResult返回E_POINTER
    • COM接口的属性为另一个COM对象,IDL该怎么写?
    • 如何在ATL的OnDraw事件中画位图?
    • 一个EXE程序里的几个线程,如何改变优先级别
    • 显IP的QQ的原理是怎么样的
    • ExcelCOM插件的问题
    • 如何用多线程表示的问题

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有