650 likes | 747 Views
COM 简 介. 新教材 第 10 章. 10.1.1 COM 的概念 组件对象模型 COM 是 Microsoft 公司的一种技术基石,在 Microsoft 公司的 MSDN 中是这样定义的:“ COM 是软件组件互相通信的一种方式,它是一种二进制和网络标准,允许任意两个组件互相通信,而不管它们在什么计算机上运行(只要计算机是相连的),不管计算机运行的什么操作系统(只要该操作系统支持 COM ),也不管该组件机是用什么语言编写的。”. 客户程序. COM 对象. 请求. 响应.
E N D
COM 简 介 新教材 第10章
10.1.1 COM的概念 组件对象模型COM是Microsoft公司的一种技术基石,在Microsoft公司的MSDN中是这样定义的:“COM是软件组件互相通信的一种方式,它是一种二进制和网络标准,允许任意两个组件互相通信,而不管它们在什么计算机上运行(只要计算机是相连的),不管计算机运行的什么操作系统(只要该操作系统支持COM),也不管该组件机是用什么语言编写的。”
客户程序 COM对象 请求 响应 COM是基于客户/服务器模型的,每个COM对象的工作方式类似于服务器,可接收收和处理来自客户程序的请求,并产生自动回复信息。 COM对象和客户程序
通常编写程序,首先要编写源代码,再将这些源代码编译成目标码。这样做会有两个不便之处:通常编写程序,首先要编写源代码,再将这些源代码编译成目标码。这样做会有两个不便之处: 1. 如果有多个程序,而它们多数模块的功能相同,仅有部分模块功能不同,那么每个程序都要重新写源代码,重新编译。而已编写好的,功能相同的程序不能被直接使用。 2. 不同语言编写的程序,由于源代码不同,因此不能互相调用,例如用VB编写的程序,不能调用其它语言编写的程序,也不能把其它语言编写的源代码直接拷贝的VB程序中。
采用COM模型可以提高软件的重复利用率和共享程度。随着应用的发展,程序越来越大,编写程序越来越复杂,可以让一些模块更加通用,把别人编译好的软件直接“嵌入”到自己的软件中,这样使得在开发大型软件时效率大大提高。采用COM模型可以提高软件的重复利用率和共享程度。随着应用的发展,程序越来越大,编写程序越来越复杂,可以让一些模块更加通用,把别人编译好的软件直接“嵌入”到自己的软件中,这样使得在开发大型软件时效率大大提高。
10.1.2 COM对象的类型 COM对象是通过一系列标准接口与外部程序进行数据交换的。接口是COM对象和调用程序之间订立的协议,它指明COM对象和数据程序交换所使用的方法、属性和事件。一般来说,COM对象有两种类型接口:即标准接口和用户接口。 标准接口是Microsoft公司定义的接口,可以在编写的程序中通过标准接口访问有关的COM对象,这种接口含有或执行各种与COM有关的作业。编写人员也可以根据需要,设计自己的COM对象接口,这就是用户接口。
10.1.3 Activex与COM的关系 Microsoft的ActiveX技术是遵循COM规程的,或者说是COM理论的具体化。因此ActiveX和COM的关系可以简单描述如下:ActiveX是建立在COM基础上的,它采用简化之后的OLE技术(对象链接与嵌入),并使OLE随时处于激活(Active)状态,以处理信息。
10.2 ActiveX简介 10.2.1 ActiveX模型 ActiveX模型包括: ActiveX控件 ActiveX脚本 ActiveX文档 ActiveX服务器框架 ActiveX会议 Java虚拟机
1. Activex控件 ActiveX控件是一个提供特定功能的二进制对象。程序开发人员可以把ActiveX控件添加到自己编写的程序中。 ActiveX控件可以用于各种语言环境中,也可以用于Web网页中。 ActiveX控件是一种开放结构式的对象引用技术,它不是某个特定对象的语言产物,编程人员可以通过VB(企业版)、Visual C++、Borland C++以及Delphi等多种语言来建立ActiveX控件
2. ActiveX脚本处理 ActiveX脚本处理在诸如VBScript、JavaScript这样的脚本语言中配合使用ActiveX控件的处理过程。通过使用脚本语言,可以使程序更具交互能力。
3. ActiveX文档 ActiveX文档是一种ActiveX表示法的非HTML文档。如同Word,Excel建立的Microsoft Office文档一样,通过使用ActiveX文档,可以将一个Microsoft Office文档加入一个Web应用程序中,然后通过制定的浏览器来使用。
10.2.2 ActiveX控件 1. ActiveX控件 VB中的控件分两种,即内部控件(标准控件)和ActiveX控件。 ActiveX控件是扩展名为.Ocx的控件,通常存放在Windows的System目录下。可以通过VB集成环境的“工程—部件”菜单添加到工具箱中,或从工具箱取消。内部控件是VB工具箱中“常驻”控件,始终出现在工具箱中。
把所需的ActiveX控件加到工具箱中的步骤: (1)执行“工程”菜单中的“部件”命令,显示“部件”对话框; (2)在该对话框中选择“控件”选项卡,显示ActiveX控件的列表; (3)在列表框中找到需要添加的控件名称; (4)单击控件名称左侧的复选框; (5)重复上述步骤,选择其它需要加到工具箱中的控件; (6)单击“确定”按钮。 (演示)
2.可插入对象 可插入对象也是一种ActiveX控件,只是插入的对象本身就是一个应用程序。执行“工程”菜单中的“部件”命令,打开“部件”对话框。然后选择“可插入对象”选项卡。(演示) 由于可插入对象也是一种ActiveX控件,因此也可以把它们加的工具箱中,并像使用普通控件一样使用工具箱中的可插入对象。(演示)
可插入对象的使用方法 例:在VB中使用Microsoft Word可插入对象 (1)首先新建一个工程,工程类型选择“标准EXE”; (2)在VB工具箱中加入“Microsoft Word文档”; (3)单击工具箱中的Word图标,然后在窗体上画一个框,该框中将显示Word的编辑窗口; (4)在此窗口中,像在Word环境下一样,输入文字,并按照自己的要求进行编辑,调整格式。 (5)完成文档的编辑后,单击窗体上的空白处,Word文档环境消失,所输入的文字出现在窗体上。运行程序,可以显示刚才输入的文档。 (6)若要对刚才的文档进行修改,可在Word文档区单击鼠标右键,在弹出的快捷菜单中选择“编辑”命令,返回到Word文档环境。 (演示)
10.2.3 ActiveX DLL 和ActiveX EXE组件 ActiveX DLL 和 ActiveX EXE 组件就是具有ActiveX机制的动态链接库(DLL)和EXE文件,文件后缀分别是 .DLL 和 .EXE,是一种特殊的动态链接库和可执行文件。 1.ActiveX DLL组件 ActiveX DLL组件属于进程内组件,它与调用它的应用程序在同一个进程中,因而可以快速地访问对象的操作。但是进程内组件必须使用应用程序的执行线程。使用的ActiveX控件(.Ocx)也属于进程内组件。进程内调用组件的原理如下页图所示。应用程序的调用函数必须等待ActiveX DLL组件运行完成后,才能执行下一语句。
程 序 进 程 调用 等 待 ActiveX DLL 组件 返回 程 序 进 程
2.ActiveX EXE 组件 ActiveX EXE 组件属于进程外组件,它与调用它的应用程序运行在不同的进程,ActiveX DLL组件与应用程序的数据交换是通过进程间的通信来实现的。进程外组件调用的原理如下页图所示。应用程序不需要等待ActiveX EXE 组件返回,就可以立即执行下一语句。所以ActiveX EXE 组件,可以编写需要异步执行的程序。
程 序 进 程 调用 ActiveX EXE 组件 返回 程 序 进 程
10.3 Activex EXE 组件编程 ActiveX EXE 组件是运行于进程外的组件,它可以在自己的地址空间运行。 在实际开发中,有时会遇到比较费时、占用计算机资源较多的工作,如大量的数据计算、数据库查询操作等,或者对计算机实时型要求很高的工作,如数据通信程序。在这种情况下,最好采用异步执行方法,减少主程序的等待时间,即采用ActiveX EXE 组件技术实现多进程编程。 ActiveX EXE 编程方法分两步: 1.建立ActiveX EXE 组件; 2.建立ActiveX EXE 组件应用程序。
10.3.1 建立ActiveX EXE 组件 建立ActiveX EXE 组件,必须定义类模块,并在类模块中给出组件的调用接口,即类的属性、方法和事件。具体方法如下: 第1步:启动VB并创建一个新的 工程,在新建工程对话框中。 选择“ActiveX EXE”图标,打开 一个类模块窗口。 第2步:选中该类模块,在属性 窗口中,将类的名称设置为 Countcls,Instancing属性保存 默认设置5—MultiUse。(右图) 第3步:保存工程和类模块。 第4步:根据需要编写类模块代码。
类模块一般是作为单独文件保存的。它的扩展名为 .cls。在类模块编写代码时,与普通标准模块程序编写方法基本相同。不同之处是: (1)Initialize和Terminate事件。 类模块中存在两个事件:Initialize和Terminate事件。 Initialize事件执行类的初始化操作,可以在这个事件函数中对类的属性值以及一些变量赋初值。Terminate事件执行类的终止操作,例如释放一些变量等。
(2)类属性过程 类属性过程比较复杂,编程比较麻烦,但是VB提供了一个外接程序,即类生成器实用工具,可以借助该工具编写类模块的接口程序。 例如,我们可在CountPrj工程中编写以下Fuction过程,实现两个整数的求和运算: Function Plus(x As Integer,y As Integer)As Integer Plus = x + y End Function
第5步:在“工程”菜单中选择“工程属性”,打开“工程属性”对话框,将工程名称设置为CountPrj,其它选项设置为默认值。第5步:在“工程”菜单中选择“工程属性”,打开“工程属性”对话框,将工程名称设置为CountPrj,其它选项设置为默认值。 第6步:保存工程并编译生成EXE文件。由于该工程是一个ActiveX组件工程,所以它虽然是一个EXE文件,但是不能独立运行,只能在其它新建的程序中调用该组件。
10.3.2 ActiveX EXE 组件应用程序 ActiveX EXE组件需要通过应用程序来调用。在组件中创建了若干类。为了调用这些类,必须建立类的实例。 在应用程序中建立ActiveX EXE组件的引用实例的步骤: 第1步:启动VB创建一个新工程,在“新建工程”对话框中选择“标准EXE”,单击“确定”按钮。 第2步;选择“工程”菜单中的“引用”项,打开“引用”对话框,在可引用列表框中,选择需要引用的ActiveX EXE程序,然后单击“确定”按钮。
第3步:创建类的对象 若要使用某个类,只有创建类的对象后,才能使用类的一些方法,其语法格式如下: Dim <对象名> As <类名> ’声明对象类型 Set <对象名> = New <类名> ’创建对象 也可以用以下语法格式声明并创建对象: Dim <对象名> As New <类名> 例如,为了使用上面类中的Plus过程,需要编写代码如下: Private Sub Command1_Klick( ) Dim MyCls As New CountCls Text1.Text=MyCls.Plus(10,10) End Sub
第4步:当我们不需要对象时,应该释放此对象,免得它一直占用资源。释放对象的语法是:第4步:当我们不需要对象时,应该释放此对象,免得它一直占用资源。释放对象的语法是: Set <对象名> = Nothing 执行这条语句后,该对象就释放掉了,不再占用内存资源。
实验10 Activex的简单应用 一、 ActiveX EXE 组件编程 1. 实验要求 对于循环计数程序在普通的VB中就可以计算完成,但是对于循环次数特别大的程序,程序若放在主模块中,则会占用较多的CPU资源,在计算过程中,会出现窗口没有反应的假死机情况。若采用ActiveX EXE编程计数,则可避免出现这种情况。 本实验按顺序使用普通方法、改进后的普通方法和ActiveX EXE三种方法编写一个从1到1000三重计数的程序,理解这种计数的作用和开发方法。
一、 ActiveX EXE 组件编程 2. 实验步骤——普通方法 用普通的方法编写一个从1~1000三重循环计数程序。方法如下: 1)新建一个VB标准EXE工程。 2)在Form1中加入一个Timer控件、两个Label和两个文本框。将Timer控件的Interval属性设置为600。
3)编写控件的Timer事件的程序 Private Sub Timer1_Timer() Text1.Text = Format(Now(), "hh:mm:ss") End Sub 4)编写三重循环计数程序 Public Function countLoop() As Long Dim i As Long Dim j As Long Dim k As Long Dim g As Long k = 0 For i = 1 To 1000 For j = 1 To 1000 For k = 1 To 1000 g = g + 1 Next k Next j Next i countLoop = g End Function
5)编写“计算”按钮Command1_Click程序 Private Sub Command1_Click() Text2.Text = countLoop() End Sub 6)执行程序
按程序设计逻辑,当单击“计算”按钮后,将调用循环计数函数countLoop,并且在文本框Text2中显示循环次数。但实际单击后,却发现时钟不显示了,整个程序好象出现了死机现象。此时千万不要关机或重新启动,因为这是一种假死机现象,是循环计数函数正在运行的原因,此时可按Ctrl+Break键中断程序的运行。当进行1至1000的三重计数循环,循环此数为109次,这时将占用大量的CPU资源,造成上述现象。按程序设计逻辑,当单击“计算”按钮后,将调用循环计数函数countLoop,并且在文本框Text2中显示循环次数。但实际单击后,却发现时钟不显示了,整个程序好象出现了死机现象。此时千万不要关机或重新启动,因为这是一种假死机现象,是循环计数函数正在运行的原因,此时可按Ctrl+Break键中断程序的运行。当进行1至1000的三重计数循环,循环此数为109次,这时将占用大量的CPU资源,造成上述现象。
方法二:普通方法改进后的程序 普通编程方法因循环计数函数占用过多的资源,所以需要改进。若在循环计数的函数中加入 DoEvents 语句,暂时中断当前的程序,把控制权交给Windows系统,就可避免出现假死机现象。下面是改进后的循环计数函数: Public Function countLoop() As Long Dim i As Long Dim j As Long Dim k As Long Dim g As Long k = 0 For i = 1 To 1000 For j = 1 To 1000 For k = 1 To 1000 g = g + 1 DoEvents '暂时中断程序,将控制权交给Windows系统 Next k Next j Next i countLoop = g End Function
方法三:建立ActiveX EXE 组件技术方法 除采用DoEvents语句实现多任务的工作,还有一种方法,就是ActiveX EXE 组件技术。这种方法需分两步进行:第一步:建立ActiveX EXE 组件;第二步,编写Activex应用程序。 第1步:建立ActiveX EXE 组件 采用ActiveX EXE 可以编写出多任务程序,将占用系统资源较多的程序放到后台执行,以提高程序的效率。对于前面的三重循环计数程序,采用ActiveX EXE 组件编写的程序如下:
方法三:建立ActiveX EXE 组件技术方法 1)启动VB,创建一个新的工程,在新建工程对话框中,选择“ActiveX EXE”图标,VB将打开一个类模块窗口。
方法三:建立ActiveX EXE 组件技术方法 2)选中该类模块窗口,在属性窗口中,将类模块的名称改为CountCls(原来为Class1)。
方法三:建立ActiveX EXE 组件技术方法 3)在工程资源管理器窗口中,单击“工程1(工程1)”,然后打开属性窗口,把名称属性改为CountProj. 4)保存工程和类模块,文件名为ActivexCount.vbp和ClassCuont.Cls。此时工程资源管理器如图所示。
方法三:建立ActiveX EXE 组件技术方法 6)选择菜单“文件”中的 “生成CountProj.exe”, 生成EXE文件。由于 CountProj.exe是一个 ActiveX组件,所以它虽 然是一个EXE文件,但它 不能独立运行,只能在其 他新建程序中调用该组件。 5)打开类模块窗口,编写代码。 Public Function Calcount() As Long Dim i As Integer Dim j As Integer Dim k As Integer Dim g As Long Calcount = 0 For i = 0 To 1000 For j = 0 To 1000 For k = 0 To 1000 g = g + 1 Next k Next j Next i Calcount = g End Function
方法三:建立ActiveX EXE 组件技术方法 第2步:使用Activex EXE组件 1)启动VB,建立一个新的工程,在“新建工程”对话框中选择“标准EXE”,然后单击“确定”按钮。 2)选择“工程”菜单的“引用”项,打开引用对话框,在“可用的引用”列表框中,选择“CountProj”,然后单击“确定”按钮。
方法三:建立ActiveX EXE 组件技术方法 第2步:使用Activex EXE组件 3)设置界面并设置属性(同方法1)。 4)为“计算”命令按钮(Command1)编写程序: Private Sub Command1_Click() Dim LargeCount As CountCls Dim Result As Long Text2.Text = "" Set LargeCount = New CountCls Result = LargeCount.Calcount Text1.Text = Result End Sub 5)编写时间控件Timer1的程序(同方法1) 6)运行程序,观察一下效果。
10.4 ActiveX DLL 组件编程 ActiveX DLL组件的建立与使用方法与ActiveX EXE 组件是类似的。组件和使用ActiveX DLL 组件的一般实现操作步骤是: (1)用VB设计组件所需要的窗体; (2)设计类的接口,定义类的属性、方法及事件; (3)编译为动套链接库(DLL),并对编译好的组件进行调试; (4)建立应用程序工程,在应用程序中引用组件对象。
10.4.1 建立DLL 组件 要建立ActiveX DLL组件可按如下步骤操作: 1. 新建一个工程,在“新建工程”对话框中选择“Activex DLL”图标,VB将自动在工程中添加一个类模块Class1。 2. 根据需要,在工程中添加组件的界面窗体,并设计该界面。 3. 对类模块编程。可以借助VB的类生成器实用根据编写类的属性、事件和方法。
10.4.2 编写ActiveX DLL组件应用程序 建立ActiveX DLL组件应用程序需要新建一个VB工程,工程类型为“标准EXE”。然后按下面步骤编写应用程序: 1. 打开“工程”菜单,选择“引用”,在引用的列表框中现在前面建立的ActiveX DLL文件; 2. 设计应用程序界面的代码,在代码中,要创建ActiveX DLL中类的对象,并编写相应的事件程序。 最后运行程序完成程序设计工作。
实验10 二、ActiveX DLL组件编程 1. 实验要求 建立一个ActiveX DLL动态链接库,设计一个DrawGame类,这个类提供一种数字抽奖服务,即由用户来碰运气,进行数字抽奖,将抽出的数字与幸运号码比较,若数字相同则中奖。
实验10 二、ActiveX DLL组件编程 2. 实验步骤 (1)开发ActiveX DLL组件 1)新建一个VB工程,在“新建工程”对话框中选择“ActiveX DLL”图标,然后单击“确定”按钮,将自动在工程中添加一个类模块Class1.
10.5 ActiveX 控件(OCX控件)编程 10.5.1 用ActiveX控件接口向导建立ActiveX控件 VB提供了ActiveX控件创建向导程序:ActiveX控件接口向导。可通过VB集成开发环境的“外接程序”菜单加载并运行该程序。借助它可以方便地创建ActiveX控件接口。 当然,在使用ActiveX控件接口向导之前,一定要对创建的控件进行设计,确认需要哪些属性和方法,提供哪些事件。
实例:使用ActiveX接口向导建立ActiveX控件的方法步骤:实例:使用ActiveX接口向导建立ActiveX控件的方法步骤: 第1步:启动VB并新建一个工程,工程类型选择“ActiveX控件”。 VB自动把一个名为UserControl(用户控件)的设计器添加到工程中,该设计器实际上相当于一个窗体,因此也称用户控件窗体。
第2步:在用户控件设计器窗体上,根据需要设计自己的界面。第2步:在用户控件设计器窗体上,根据需要设计自己的界面。 第3步:在“外接程序”菜单中选择“外接程序管理器”。在出现的“外接程序管理器”对话框后,在此对话框中选择“VB 6 ActiveX控件接口向导”,并且选择“加载/卸载”复选框,然后单击“确定”按钮。