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

COM,COM组件,API,ACTIVEX控件其间的从属关系,请大家帮忙理一理

2013-01-02 
COM,COM组件,API,ACTIVEX控件之间的从属关系,请大家帮忙理一理我会点java和vb,现在要参与一个vb.net项目,

COM,COM组件,API,ACTIVEX控件之间的从属关系,请大家帮忙理一理
我会点java和vb,现在要参与一个vb.net项目,所以有些概念想弄清楚。
因为没有参见过c语言的项目,所以下面有些理解是自己猜出来的,望大家指正。

我比较通俗的理解:

1,com:是一种规范,只提供一个接口,具体怎么实现我不清楚。

2,com组件:顾名思义就是指实现了com规范的组件,比如说win32系统api就是基于com规范开发的一种组件,ACTIVEX控件也是基于com规范实现的。只要是称为com组件的dll,ocx,不管是用什么语言开发的,都能被不同的语言调用。
(疑惑之处:c实现的api,vb或者别的语言调用的话,如果某个参数的数据类型c有vb(delphi)没有,这个时候传递参数时微软是怎么处理的)

3,activeX和api,是不是可以认为用vb生成activeX就是自己开发的一个api,可以像调用系统api一样被c语言调用?
[解决办法]
com:是一种规范,不是一个接口。
ACTIVEX控件不是完全基于com规范。
参数传递有对应的转换表
用vb生成activeX就是自己开发的一个activeX,一般不可能符合com规范
API是系统提供的编程接口
[解决办法]
1)API 是过程级别的接口约定;COM 是对象级别的接口约定。
2)API 是弱类型,只要调用双方在参数堆栈的长度上符合约定即可;而 COM 是强类型,调用双方必须每个参数都匹配(遵循统一的 COM 类型定义)。
3)COM 和 ActiveX 其实是接近的,COM 偏重理论,整个标准不限于 Windows 平台;ActiveX 偏重技术,属于 Windows 平台下的 COM 实现。显然 COM 组件的概念包括但大于 ActiveX。
[解决办法]
两者没有必然的联系,com是一种规范; api是个广义的概念,它有没有遵循com规范视具体情况了
[解决办法]
COM是一种机制、规范,是一组二进制可移植的可执行代码;

API与COM、ActiveX没有直接关系;

ActiveX 是基于Windows平台的COM实现,有些书里有详细的底层实现方法。
[解决办法]

引用:
我想了解一个大概。

大概就是一种规范的模型体系,有配套的一系列API支持的类型约定,基于
特定的函数入口初始化这种模型,然后通过规范好的几个固有结构体传输
参数执行指定过程。在系统中,以注册表为记录基础,以GUID为类型关键
说明,有专门的服务处理机制。总之,用起来容易,通常的开发起来也不难,
但要搞清楚具体架构或流程,就是非常复杂的事。
在VC的 Platform SDK 中有详细的 COM 模型说明和范例,还有纯 API
打造的 COM 模型范例,你可以详细看看。
[解决办法]
ms的com 是基于ms系统的注册机制的,跟Unix系列系统的通用动态库不是一个概念。
com其实是一种调用规范,规定了ms平台下各种编程语言之间的调用规则。
用C写过dll就知道所谓的dll函数导出表??就是其它语言包括自己可以调用的函数列表,其实就是一个二进制代码的函数地址引用表。所有的语言最终也要编译为二进制代码,对于计算机是没有语言的概念的,所以这种调用是有理由行的通的。
ms既要保证代码重用又要实现版本兼容和执行空间效率,不得不依赖为人诟病的注册机制。可想将来一旦有人揭秘这种机制的内幕,MS当前的XP等系统的漏洞就不只这么多了。
[解决办法]
引用:
com也是建立在api基础之上的?

所谓的 API 就是将多个函数入口点以公共的方式放出来,可供别的程序调用,
而别的程序要调用到 API 函数需要使用 LoadLibrary 先将程序载入内存,
然后通过 GetProcAddress 取得内部函数的地址,当你调用的时候,直接
通过 CallWindowProc 执行取得的函数地址便可完成 API 函数的调用过程。
而 Windows 程序不论是什么样的接口,都会有公共的入口点的,比如 Windows
的可执行程序,入口点基础是 WinMain,而 ISAPI 接口有4个入口点,一下
不记得具体的了,驱动程序的入口点是 DriverEntry,NT服务程序的是 WinMain
和 ServiceMain,COM 的是 DllMain DllCanUnloadNow DllGetClassObject 
DllRegisterServer DllUnregisterServer 等。这种接口应该都可以用
调用 API 的方法取得的。
[解决办法]
引用:
vb可以调用c语言编写的api是因为约定好可以调用的,跟com规范没关系?

C 也可以做 COM 组件。就看你选用哪个接口。
[解决办法]
引用:
com也是建立在api基础之上的?

NO
只是操作系统是基于 API 的,所以组件必定有一部分需要通过 API 的方式与操作系统打交道。
就像某些网店,网络交易只接受信用卡结算,但是他自己采购时不排除用现金交易。
[解决办法]
引用:
com也是建立在api基础之上的?


理论上说不是。。。

实际上来说,完全是。。。 任何所谓的windows编程技术基本上都靠 winAPis 实现的,申请内存,销毁内存,互斥,多线程,==。。。。 你可以想象得到的任何动作几乎都离不开api,就连汇编写win32程序也是如此,所以说你那个疑问可以给予一个肯定的答复。。。

只不过你那样说不严谨,com是通用规范,windows上的com组件是ms根据规范实现的一套符合windows的编程技术。。。

说来说去都是一句话,windows提供了十分丰富广泛的功能基础,而你千变万化的对这些功能进行组合,就成了无数的windows程序.............外加“传说中”的各种技术。。。
[解决办法]

引用:
假如我用vb6.0创建一个ActiveX控件的话,在文件-〉生成工程ProductName.ocx后,我的这个ocx就已经遵循了com规范了?

我可以在c程序里调用它了?


可以
[解决办法]
引用:
假如我用vb6.0创建一个ActiveX控件的话,在文件-〉生成工程ProductName.ocx后,我的这个ocx就已经遵循了com规范了?

我可以在c程序里调用它了?

必须按照 COM 的方式进行调用。
[解决办法]
引用:
假如我用vb6.0创建一个ActiveX控件的话,在文件-〉生成工程ProductName.ocx后,我的这个ocx就已经遵循了com规范了?

我可以在c程序里调用它了?

C程序不敢说,不过Windows的C++应该是没问题。你可以看看我博客的这篇文章:
http://blog.csdn.net/SupermanKing/archive/2008/10/16/3082809.aspx
[解决办法]
我会点java和vb,现在要参与一个vb.net项目,所以有些概念想弄清楚。
因为没有参见过c语言的项目,所以下面有些理解是自己猜出来的,望大家指正。

我比较通俗的理解:

1,com:是一种规范,只提供一个接口,具体怎么实现我不清楚。
Com确实是一种规范,提供了二进制一级的跨语言能力。

2,com组件:顾名思义就是指实现了com规范的组件,比如说win32系统api就是基于com规范开发的一种组件,ACTIVEX控件也是基于com规范实现的。只要是称为com组件的dll,ocx,不管是用什么语言开发的,都能被不同的语言调用。
(疑惑之处:c实现的api,vb或者别的语言调用的话,如果某个参数的数据类型c有vb(delphi)没有,这个时候传递参数时微软是怎么处理的)
Com组件是使用了Com技术,以接口形式来使用的组件。Win32系统的API部分是Com组件提供的功能,但是Win32系统API其实不全是Com Interface。比如简单的CreateProcess等API是原生的C函数。ActiveX控件是基于Com技术实现的一种控件。因为是使用Com技术来开发,所以具有2进制级别的跨语言能力。关于参数传递,Com的参数传递使用Mashmal技术,就是列集和散列,因此可以对于不同语言的参数类型通过列集再传递给代理存根后散列就能得到目的语言调用的参数。

3,activeX和api,是不是可以认为用vb生成activeX就是自己开发的一个api,可以像调用系统api一样被c语言调用?
ActiveX技术是开发控件的,可以用VB开发一个ActiveX控件,经过注册后,就能提供给其他语言使用。(无需重新编译)。当然你可以给任意的语言使用,包括C,C++,甚至VBS,PHP,JS。
[解决办法]
通常 VC、BC、DEV-C、VB 这种是工具,支持的语言语法很多,
如 VC 或 BC ,支持 C/C++ 的语言,但 Keil C 就只支持
C 语言,不支持 C++,所以类呀、继承等概念都没有,而 BASIC 
的工具有 VB、QB 等,如果是 QB,和 VB 的支持库完全不同,
甚至没有 API 和窗口的概念,而 VB 也没有调用中断的或图形
屏幕的概念。
[解决办法]
引用:
关于第二点,你能用通俗一点解释吗?
比如说我vb写的activeX控件里有一个有参函数,并且这个参数的类型是主调语言(假设就是你说的php)
没有的,那么vb会为了能让php语言调用这个方法,他会提供一个新的参数列表去迎合php语言吗

一般来说,以VC++为例,写Com组件时候,只能使用基本数据类型。
int,double,....,variant_t(这就是VB的那个Variant变体类型)。
所以调用端实际上使用接口的时候,都有基本数据类型来进行匹配与对应。


[解决办法]
COM是技术规范     COM组件多指不带UI的符合COM规范的程序集     ACTIVEX控件多指以MFC为开发框架多带UI的符合COM规范的程序集    API这个不解释

COM是独立的       COM组件和ACTIVEX控件的开发都会使用Win32 API

基本上可以这么理解,但不是绝对的
[解决办法]
引用:
调用的时候要考虑的?我觉得应该是生成的时候就应该考虑到。????

VB 开发的组件已经遵循了 COM 标准,所以不用你考虑了。
你只要保证调用者遵循 COM 标准。

热点排行