背景
前面写过一篇关于数据库技术的文章,加上正在重温vb,对于里面接触最多的ActiveX组件涉及的很多概念,总觉得他们之间的关系没有足够,所以决定再深入研究一下,先附上上一篇的链接: 数据库访问和组件技术相关概念(ADO、ActiveX、DLL、ODBC等)详解
名词详解
还是先把本文要讲的一些概念简单说一下
com
在计算机编程领域,COM(Component Object Model)是一个重要的概念,它为开发人员提供了一种在不同平台和语言之间进行软件组件交互的标准。在COM的基础上,衍生出了ActiveX、ActiveX DLL和ActiveX EXE等技术,它们在软件开发和应用中扮演着重要的角色。
COM是一种面向对象的软件组件技术,它允许以组件的形式将代码封装起来,并提供给其他程序使用。COM组件可以使用不同的编程语言编写,并且可以在不同的操作系统和平台上运行。COM组件之间的交互通过接口进行,这使得组件之间的通信更加灵活和可靠。
提炼一下:com是一个标准也是一项技术,主打一个跨平台跨语言,复用,另外二进制兼容,版本控制。
ActiveX
ActiveX是基于COM的技术,是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM),它允许开发人员创建可嵌入到网页或其他应用程序中的交互式控件。ActiveX控件可以使用HTML、JavaScript等前端技术进行开发,并且可以在不同的浏览器和操作系统上运行。它广泛应用于网页浏览器插件、多媒体播放器、图形编辑器等领域。当然在
提炼:基于com规范,是Microsoft提出的一个标准
ActiveX DLL
ActiveX DLL是一种动态链接库,它包含了COM组件的实现代码和相关资源。通过使用ActiveX DLL,开发人员可以将特定功能封装为一个组件,并在不同的应用程序中共享和重用。ActiveX DLL常用于开发可扩展的应用程序、插件和服务。
提炼:ActiveX DLL是一种特殊的DLL,它包含com对象。
ActiveX DLL是进程内服务器,和调用它的app属于同一个进程,称之为进程内服务器
示例代码:
' ActiveX DLL示例 Public Class MyComponent Public Function Add(ByVal a As Integer, ByVal b As Integer) As Integer Return a + b End Function End Class
ActiveX EXE
ActiveX EXE是一种独立的可执行文件,它包含了COM组件的实现代码和相关资源。与ActiveX DLL不同的是,ActiveX EXE以进程的形式运行,并提供了更高的安全性和隔离性。ActiveX EXE常用于开发独立的后台服务、服务器端组件和可执行文件。
,ActiveX EXE服务器进程和客户进程是两个独立的进程,称之为进程外服务器,两者的通信是通过消息传递机制完成的
示例代码:
' ActiveX EXE示例 Public Class MyServer Public Function Multiply(ByVal a As Integer, ByVal b As Integer) As Integer Return a * b End Function End Class
ActiveX DLL与ActiveX EXE的关系和区别
ActiveX DLL和ActiveX EXE都是基于COM的技术,用于创建和使用可重用的软件组件。
关系
- 共同点:ActiveX DLL和ActiveX EXE都是基于COM的技术,它们都使用COM接口进行组件之间的通信和交互。无论是ActiveX DLL还是ActiveX EXE,都可以被其他程序引用和使用。
- 依赖关系:ActiveX EXE可以使用ActiveX DLL,但ActiveX DLL不能直接使用ActiveX EXE。ActiveX EXE可以将ActiveX DLL作为其依赖项,通过COM接口进行调用和交互。
区别
- 运行方式:ActiveX DLL以动态链接库的形式存在,它被其他程序动态加载并调用(进程内服务器)。而ActiveX EXE是一个独立的可执行文件(进程外服务器),以进程的形式运行。
- 安全性和隔离性:ActiveX EXE相对于ActiveX DLL具有更高的安全性和隔离性。由于ActiveX EXE以进程的形式运行,它可以提供更好的隔离性,避免因为组件错误导致整个应用程序崩溃。
- 调用方式:ActiveX DLL的调用是通过函数调用的方式进行的,而ActiveX EXE的调用是通过远程过程调用(RPC)来实现的。这意味着ActiveX EXE可以在不同的计算机上运行,并通过网络进行远程调用。
- 性能:ActiveX DLL相对于ActiveX EXE具有更好的性能。由于ActiveX DLL是以动态链接库的形式存在,它的调用和交互过程更加高效和快速。而ActiveX EXE由于需要通过进程间通信(IPC)进行调用,因此会有一定的性能损耗。
如何选择:
选择使用ActiveX DLL还是ActiveX EXE取决于具体的需求和应用场景。
- 如果需要创建一个可嵌入到其他应用程序中的组件,并且对性能要求较高,可以选择使用ActiveX DLL。
- 如果需要创建一个独立的后台服务、服务器端组件或可执行文件,并且对安全性和隔离性要求较高,可以选择使用ActiveX EXE。
下面是一个二维表,总结了ActiveX DLL和ActiveX EXE的关系和区别:
ActiveX DLL | ActiveX EXE | |
运行方式 | 动态链接库 | 可执行文件 |
安全性和隔离性 | 较低 | 较高 |
调用方式 | 函数调用 | 远程过程调用 |
性能 | 较好 | 较差 |
应用场景 | 嵌入其他应用程序 | 独立后台服务、服务器端组件、可执行文件 |
名词之间的关系
图示
解释
1、COM是一种规范,实现组件的复用和扩展。
2、ActiveX是基于COM的微软提出的一种标准。(它是一种技术框架,用于创建和使用可重用的软件组件。ActiveX技术可以用于多种编程语言和平台,包括Visual Basic(VB),C++,.NET等。)
3、vb可创建的组件(也叫代码部件)包括ActiveX控件、ActiveX DLL和ActiveX EXE, 它们都属于ActiveX组件的一种形式,它们都遵循了ActiveX技术标准,并可以被其他程序调用和使用,类似于一个服务。所以ActiveX DLL和ActiveX EXE也可以称之为服务。
在这个层次结构中,COM提供了组件之间的通信和交互的规范,ActiveX是基于COM的技术框架,提供了创建和使用组件的方式,而ActiveX控件、ActiveX DLL和ActiveX EXE则是在ActiveX技术之上创建的具体组件类型(也可以称之为服务)。
另外关于DLL和com的区别在我上面提到的文章中有讲解,也有配图,欢迎到上面点击链接进行阅读。
代码
现在给一段代码,用来创建一个ACtiveDLL部件,同时创建测试类测试这个ACtiveDLL代码部件是否成功
首先,创建一个新的VB6.0项目,选择ActiveX DLL作为项目类型。
- 在"Class1"模块中编写以下代码:
Option Explicit Public Function AddNumbers(ByVal num1 As Integer, ByVal num2 As Integer) As Integer AddNumbers = num1 + num2 End Function
上述代码定义了一个名为"AddNumbers"的函数,它接受两个整数参数并返回它们的和。
- 在"Class2"模块中编写以下代码:
Option Explicit Public Sub TestDLL() Dim obj As New Class1 Dim result As Integer result = obj.AddNumbers(5, 10) MsgBox "Result: " & result End Sub
上述代码定义了一个名为"TestDLL"的子过程,它创建了一个Class1对象,并调用其中的AddNumbers函数来计算5和10的和。然后,它使用消息框显示计算结果。
- 在"Project1"模块中编写以下代码:
Option Explicit Public Sub Main() Dim obj As New Class2 obj.TestDLL End Sub
上述代码定义了一个名为"Main"的子过程,它创建了一个Class2对象,并调用其中的TestDLL子过程。
- 在项目菜单中选择"添加类模块",创建一个名为"Class3"的新类模块。
- 在"Class3"模块中编写以下代码:
Option Explicit Public Sub Test() Dim obj As New Class1 Dim result As Integer result = obj.AddNumbers(8, 3) MsgBox "Result: " & result End Sub
上述代码定义了一个名为"Test"的子过程,它创建了一个Class1对象,并调用其中的AddNumbers函数来计算8和3的和。然后,它使用消息框显示计算结果。
当运行该项目时,"Main"子过程将被调用,它将创建一个Class2对象并调用其中的TestDLL子过程。TestDLL子过程将创建一个Class1对象,并调用其中的AddNumbers函数来计算5和10的和,并将结果显示在消息框中。
另外,还可以在"Class3"模块中创建一个新的对象并调用其中的Test子过程来测试AddNumbers函数的功能。
附加问题
com组件技术只在vb中应用吗?
COM组件技术不仅限于在VB(Visual Basic)中应用,它可以在许多编程语言中使用。COM是一种面向对象的编程模型,它允许不同的软件组件在不同的编程语言中进行交互和通信。
ActiveX是一种基于COM的技术,它是一种软件组件规范,用于创建可重用的软件组件。ActiveX控件是一种特殊类型的COM组件,主要用于在Web浏览器中嵌入和展示交互式内容。虽然ActiveX最初在VB中得到广泛应用,但它也可以在其他编程语言中使用,例如C++、C#、Delphi等。
因此,COM组件技术和ActiveX不仅仅局限于VB,其他编程语言也可以使用它们来开发和使用可重用的软件组件。
java中有类似的技术吗?
在Java中,没有直接的COM组件技术或ActiveX控件,因为Java有自己的跨平台解决方案。Java使用Java虚拟机(JVM)来实现跨平台性,它提供了一种独立于操作系统的运行环境。
Java中有一种类似于COM组件的技术称为JavaBeans。JavaBeans是一种可重用的软件组件模型,它允许开发人员创建和使用独立的Java组件。JavaBeans是基于Java语言的,具有良好的跨平台性和可移植性。
此外,Java还提供了一种称为Java Native Interface(JNI)的技术,它允许Java代码与本地代码(如C或C++)进行交互。JNI可以用于与COM组件或其他本地库进行集成。
虽然Java中没有直接的COM组件技术或ActiveX,但JavaBeans和JNI提供了类似的功能,允许开发人员创建和使用可重用的软件组件,并与其他平台和技术进行交互。
我们要知道JavaBeans和JNI并不是比COM组件技术更高级的技术,它们是Java平台下的不同技术解决方案,用于不同的应用场景。
vb中工程中看到的引用和部件什么区别?
引用(Reference)是指在项目中引用外部库或组件,以便在代码中使用其功能。通过引用,可以使用其他库或组件的对象、属性和方法,以扩展VB6.0的功能。
部件(Component)是指VB6.0中的可重用的代码模块,可以是控件、类模块、标准模块等。部件可以包含属性、方法和事件,可以在项目中使用和重复利用。
组件(Component)是一个更广泛的概念,包括了部件。组件可以是独立的可执行文件、动态链接库(DLL)或ActiveX控件等,可以被其他程序调用和使用。
引用和部件的关系是,通过引用外部库或组件,可以将其部件引入到VB6.0项目中,以便使用其中的功能。
可以用比喻来解释:假设你正在建造一座房子,引用就是你从外面购买了一些材料,比如砖、水泥等。而部件就是你自己制作的一些模块,比如门、窗等。组件就是包括了这些材料和部件的整体,比如房子本身。
总结
COM、ActiveX、ActiveX DLL和ActiveX EXE是软件开发中非常重要的技术。它们通过提供标准的组件交互方式,实现了代码的重用和功能的扩展。通过学习和应用这些技术,开发人员可以更加高效地开发出功能强大且可扩展的应用程序。希望本文让你对COM、ActiveX、ActiveX DLL和ActiveX EXE有更深入的了解,并能在实际项目中应用这些技术提供了帮助。