用VB实现COM+组件配置
在Windwos2000的管理工具里有一个“组件服务”工具,可以实现对COM+组件的应用的安装、启动、删除和对组件的安装、删除。这在安装一个有 COM+组件的应用系统时时非常有用的,我们可以通过程序控制一个组件添加删除,可以通过程序实现这个过程的自动化,而不必人工停止应用再安装组件!
现在我们来讨论怎样用VB程序实现这个工具的这些功能。
一、COMAdmin接口简介
COMAdmin接口是实现这些功能的关键对象,它有有三个基本接口,分别是
IcomAdminCatalog,IcatalogCollection,IcatalogObject,调用这三个接口的相关属性方法可以实现对
COM组件的添加、删除、应用的添加、删除、启动、关闭等功能。
1、IcomadminCatalog接口介绍
IcomAdminCatalog接口代表COM+
Catalog本身。
方法:GetCollection可以取得COM+
Catalog中包含的集合。
2、IcatalogCollection接口介绍
IcatalogCollection接口可以枚举内容、读取、增加、删除集合项目。
方法:Populate让集合填入内容;
方法:PopulateBykey同Populate,但让集合从akeys指定项读取数值;
方法:remove删除一个对象,参数是对象在集合中的索引;
方法:SaveChanges保存对属性的改变,无参数,返回保存的改变次数。
3、IcatalogObject接口介绍
属性:Name:包含目录对象的只读属性;
属性:Key:包含目录对象的唯一项的只读属性,这个属性用于需要对象项的方法,如PopulateByKeys
;
属性:Valid:表示对象是否有效的只读属性;
属性:Value包含对象所支持的任何命名属性值的读/写属性,每个目录对象支持的一组命名属性。
二、程序设计思路
建立对应用和组件的控制函数,在应用列表框中列表出本机上的应用名,在属性列表框显示所选择应用中包含的组件,通过工具条按钮事件实现对所选择的应用或组件的添加、删除、启动、关闭的功能。
要实现这些功能,我们计划有如下几个函数:
1.
Createocatalog 创建取得应用集合的COMAdminCatalogCollection 对象;
2. Addapp 创建应用函数;
3.
Deleteapp 删除应用函数;
4. Startobject 启动一个应用函数;
5. Stopobject 停止应用函数;
6.
Addcomponent 在一个应用中添加一个组件;
7. Deletecomponent 在一个应用中删除一个组件;
8.
Displayobjects 在应用列表框中显示应用名;
9. Disaplaycomponent
在应用组件列表框中显示所选则的应用中的组件名。
三、VB程序的实现
1、主界面的设计
(图一)
如图一,将应用名列表放在左边的列表框lbobject内,选择一个应用,则在右边列出这个应用中的COM组件名。当我们选择一个应用或组件时,可以选择工具条上相关的操作对应用或COM+组件进行控制。
2、程序实现步骤
首先在定义变量如下
Option
Explicit
Public ocatalog As COMAdminCatalog
Public ocatcol As
COMAdminCatalogCollection
Public ocatobj As
COMAdminCatalogObject
然后我们定义一个函数实现取得COM+应用的集合.
Private Function
createocatalog() As Boolean
createocatalog = False
‘创建catalog对象
Set
ocatalog = New COMAdminCatalog
‘得到应用连接
Set ocatcol =
ocatalog.GetCollection(“Applications”)
createocatalog = True
End
Function
接下来我们在Form的启动事件里写上如下代码:
Private Sub Form_Load()
If
App.PrevInstance Then
Unload Me
MsgBox “程序已经运行!”
Exit Sub
End
If
form1.Show
If createocatalog() Then
StatusBar1.Panels(2) =
“连接COMADMIN成功”
displayobjects ocatcol
Else
StatusBar1.Panels(2) =
“连接COMADMIN失败!”
MsgBox “连接失败,请确认系统是否安装的组件服务!”
End If
End
Sub
到这里我们实现了对组件应用对象的连接,接下来就是对这些对象的操作。我们先定义这样一些函数:
Public Function
addapp(Optional name As String = “NewAppliation”, Optional activation As Integer
= 1, Optional Identity As String = “Interactive User”) As
String
‘添加一个应用
On Error GoTo errd
Set ocatobj = ocatcol.Add
‘添加一个新应用
ocatobj.Value(“Name”) = name
‘设置这个应用的属性
ocatobj.Value(“Activation”) =
activation
ocatobj.Value(“Identity”) = Identity
ocatcol.SaveChanges
‘保存关于ocatcol对象的改变
addapp = “OK”
Exit Function
errd:
addapp =
Err.Description ‘如果出错返回错误信息
End
Function
(addapp函数实现添加一个组件应用,参数name是要为这个新应用确定一个名字,我们可以默认是NewApplication,Activation和Indentity分别是配置这个应用的相关属性)
Public
Function deleteapp(name As String) As String ‘参数name是应用的PROGID
If name
<> “” Then
Dim oo As Object
Dim i As Integer
i = 0
On Error
GoTo errd
ocatcol.Populate ‘首次取得目录集合时,缺省为空,需要调用Populate来填入内容
For Each oo
In ocatcol
If oo.name = name Then
ocatcol.Remove i
‘删除索引号为i的组件应用
ocatcol.SaveChanges ‘保存
End If
i = i + 1
Next
End
If
deleteapp = “ok”
Exit Function
errd:
addapp =
Err.Description
End Function
(函数deleteapp实现删除名字为name的一个组件应用。)
Public
Function startobject(name As String) As String ‘参数name是应用的PROGID
Dim oo As
Object
On error goto errd
ocatcol.Populate
For Each oo In ocatcol
If
oo.name = name Then
ocatalog.StartApplication oo.Key ‘启动一个应用
End
If
Next
startobject = “OK”
Exit function
errd: ‘错误处理
startobject
= Err.Description
End
Function
(函数startobject实现启动名字为name的一个组件应用。)
Public Function
stopobject(name As String) As String
Dim oo As Object
On error goto
errd
ocatcol.Populate
For Each oo In ocatcol
If oo.name = name
Then
ocatalog.ShutdownApplication oo.Key ‘停止这个应用
End
If
Next
Stopobject = “OK”
Exit funcition
Errd:
Stopobject =
Err.Description.
End
Function
(Stopobject函数实现停止一个应用)
到这里我们已经实现了对应用的控制,下面我们来实现对组件的控制。
Public
Function addcomponent(name As String, filename As String) As String
Dim oo As
Object
On error goto errd
For Each oo In ocatcol
If oo.name = name
Then
ocatalog.InstallComponent name, filename, “”, “” ‘在这里实现安装组件到一个应用
End
If
addcomponent = “OK”
exit function
Next
Errd:
addcomponent =
err. Description
End
Function
(addcomponent实现在一个应用里安装一个新的组件,参数name是应用名(PROGID),filename是组件文件(即.DLL文件)的完整路径)
Public
Function deletecomponent(name As String, componentname As String) As
String
Dim oo As Object
Dim okey As Variant
Dim components As
Object
Dim i As Integer
On error goto errd
ocatcol.Populate
For Each
oo In ocatcol
If oo.name = name Then
okey = oo.Key
End
If
Next
Set components = ocatcol.GetCollection(“Components”,
okey)
components.Populate
If components.Count > 0 Then
i = 0
For
Each oo In components
If oo.name = componentname Then
components.Remove
i
components.SaveChanges
End If
i = i + 1
Next
Deletecomponent =
“OK”
Exit function
Else
Deletecomponent = “当前选择应用中没有组件!”
End
If
Errd:
Deletecomponent = err. Description
End
Function
(Deletecomponent实现在一个应用里删除一个组件,参数name是应用名(PROGID),
componentname是组件名(即组件的PROGID))
到这里,我们已经可以调用这些函数实现对组件的控制了,下面我们就来看看怎么样调用这些函数实现对组件的完全控制。
首先我们还需要添加两个过程:
Public
Sub displayobjects(CurrentConnection As COMAdminCatalogCollection)
Dim oo As
Object
CurrentConnection.Populate
With lbobject
.Clear
For Each oo
In CurrentConnection
.AddItem oo.name
‘我们将取得的对象集合的的应用名添加到对象列表框中去
Next
End With
End
Sub
(displayobjects过程实现将传入的集合显示在应用列表框中去)
Public Function
disaplaycomponent(name As String, CurrentConnection As
_
COMAdminCatalogCollection) ‘name是应用名,CurrentConnection是已经取得应用对象的集合
Dim
oo As Object
Dim okey As Variant
Dim components As
Object
CurrentConnection.Populate
For Each oo In CurrentConnection
If
oo.name = name Then
okey = oo.Key
‘取得CurrentConnection集合中名为name的应用的CLSID
End If
Next
Set components =
CurrentConnection.GetCollection(“Components”,
okey)
components.Populate
With lbcomponent
.Clear
For Each oo In
components
.AddItem oo.name ‘将组件名添加进组件列表框中
Next
End With
End
Function
(displayobjects过程实现将传入的应用的组件显示在组件列表框中)
好,有了这些函数过程,我们就能调用他们实现对应用、组件的显示和控制了。
下面的代码是调用这些函数的例子。
Private
Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case
Button.Index
Case Is = 1 ‘刷新列表
displayobjects
ocatcol
StatusBar1.Panels(1) = “刷新列表:”
StatusBar1.Panels(2) =
“刷新列表成功!”
Case Is = 2 ‘添加应用
form2.Show vbModal, Me
StatusBar1.Panels(1)
= “添加应用:”
StatusBar1.Panels(2) = “添加应用成功!”
Case Is = 3 ‘删除应用
If
lbobject.Text <> “” Then
deleteapp lbobject.Text
displayobjects
ocatcol
StatusBar1.Panels(1) = “删除应用:”
StatusBar1.Panels(2) =
“删除应用成功!”
Else
MsgBox “请选择一个应用!”
End If
Case Is = 4 ‘启动当前应用
If
lbobject.Text <> “” Then
StatusBar1.Panels(1) =
“启动当前应用:”
StatusBar1.Panels(2) = “正在启动当前应用...”
startobject
lbobject.Text
StatusBar1.Panels(2) = “启动当前应用成功!”
Else
MsgBox
“请选择一个应用!”
End If
Case Is = 5 ‘停止应用
If lbobject.Text <> “”
Then
StatusBar1.Panels(1) = “停止当前应用:”
StatusBar1.Panels(2) =
“正在关闭当前应用...”
stopobject lbobject.Text
StatusBar1.Panels(2) =
“正在关闭当前应用成功!”
Else
MsgBox “请选择一个应用!”
End If
Case Is = 6 ‘安装组件
If
lbobject.Text <> “” Then
On Error GoTo
errhandler
CommonDialog1.Filter = “组件文件 (*.dll) |
*.dll”
CommonDialog1.ShowOpen
Dim filename As String
filename =
Trim$(CommonDialog1.filename)
StatusBar1.Panels(1) =
“安装组件:”
StatusBar1.Panels(2) = “正在将组件安装进当前应用...”
addcomponent
lbobject.Text, filename
StatusBar1.Panels(2) = “组件安装成功!”
disaplaycomponent
lbobject.Text, ocatcol
Exit Sub
Else
MsgBox “请选择一个应用,再安装组件!”
End
If
errhandler:
‘按了cancel按钮
Exit Sub
Case Is = 7 ‘删除组件
If
lbobject.Text = “” Then
MsgBox “请选择一个应用!”
Exit Sub
End If
If
lbcomponent.Text = “” Then
MsgBox “请选择一个组件!”
Exit Sub
End
If
deletecomponent lbobject.Text, lbcomponent.Text
StatusBar1.Panels(1) =
“删除组件:”
StatusBar1.Panels(2) = “删除组件成功!”
disaplaycomponent lbobject.Text,
ocatcol
Case Is = 8 ‘关于程序
MsgBox
“这个程序是COM组件的控制的程序,VB6.0开发,在win2000下调试通过!欢迎指教!”
End Select
End
Sub
到这里程序完成。同样,ComAdmin的调用方法可以运用到ASP,VC等程序中去。
程序在Windows2000系统下调试通过。有关ComAdmin的详细信息请参看
用VB实现COM+组件配置的更多相关文章
- win10 64位专业版系统中显示32位dcom组件配置的方法
word.excel是32位的组件,当用户64位系统在运行窗口中输入dcomcnfg命令时,在打开的组件服务管理窗口,是找不到Microsoft Excel.word程序的.另外,Windows 环境 ...
- php调用com组件配置 以openoffice为例
什么是com组件? COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统.COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件 ...
- stark组件配置,二层URL
1.django的admin配置 2 stark组件开发 3.2层url分发 4.小结 1.django的admin配置 model.py from django.db import models # ...
- asp.net导出excel 问题及服务器的部署dcom组件配置
一.服务器上没有装office 如果要用MS的,这个问题基本不用考虑,只有安装才能解决,没有其它办法! (即使有牛人弄出来 了,估计也是给自己找麻烦) 不过,我只在服务器上装了一个2003精简版, 我 ...
- SpringMVC组件配置
web.xml . springmvc-servlet.xml 配置SpringMVC四大组件. web.xml 配置前端控制器:前端控制器就是个servlet <!-- 配置前端控制器 --& ...
- log4j.xml——java日志处理组件配置简介
(从一篇好文开始)log4j(一)——为什么要用log4j? 三:看完栗子后的感想 (1)很明显我们在编写代码的时候有各种需要打印日志的需求,比如:我们调试代码的时候:我们的应用出现了问题,我们分析. ...
- 64位windows系统如何显示32位dcom组件配置
在运行栏中输入命令:dcomcnfg,打开组件服务管理窗口,但是却发现找不到Microsoft Excel程序,这主要是64位系统的问题,excel是32位的组件,所以在正常的系统组件服务里是看不到的 ...
- Windows:Word,PPT,EXCEL com+组件配置
本文所涉及到配置前提: 服务器必须安装Office套件(Word,PPT,Excel) 第一部分 Word Com+组件权限配置 1.cmd模式输入dcomcnfg 2.找到Microsoft Wor ...
- Springboot关于tomcat容器配置、三大组件配置、拦截器配置
原文地址:http://www.javayihao.top/detail/172 1.tomcat配置 Springboot默认使用的就是嵌入式servlet容器即tomcat,对于web项目,如果使 ...
随机推荐
- The web application you are attempting to access on this web server is currently unavailable.......
今天去服务器安装了个.net 4.0 framework(原本有1.0和2.0的),配置好站点后,选择版本为4.0,访问出错,错误代码如下 Server Application Unavailable ...
- 出错的sql
alter table m_account AUTO_INCREMENT=200029860;
- 唯一索引 && 主键索引
唯一索引唯一索引不允许两行具有相同的索引值. 如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存. 当新数据将使表中的键值重复时,数据库也拒绝接受此数据.例如,如果在 ...
- vc14(vs2015) 编译php7 记录
windows 编译php 官方教程 https://wiki.php.net/internals/windows/stepbystepbuild 参考 http://blog.csdn.net/ ...
- react拖拽(表格拖拽排序、普通拖拽排序以及树形拖拽排序)
表格拖拽排序:组件地址:https://reactabular.js.org/#/drag-and-drop 拖动的排序是用React-DnD:React-DnD:http://react-dnd.g ...
- 《Unity 3D游戏客户端基础框架》多线程异步 Socket 框架构建
引言: 之前写过一个 demo 案例大致讲解了 Socket 通信的过程,并和自建的服务器完成连接和简单的数据通信,详细的内容可以查看 Unity3D -- Socket通信(C#).但是在实际项目应 ...
- Linux解压rar、zip、war、tar文件
在Linux上解压常见文件的命令: rar文件:rar e xxx.rar zip文件:unzip -xzvf xxx.zip war包:jar -xvf xxx.war tar包:tar -xzvf ...
- Linux 环境下 javac 编译错误: 编码UTF8的不可映射字符 (编码UTF8/GBK的不可映射字符)
Linux 系统下一般默认使用UTF-8编码, 使用javac 编辑使用其他编码格式编写的源吗时,会出现 “ 错误: 编码UTF8的不可映射字符 ”. 最近在使用 javac 编译 一个在wind ...
- Yii在window下的安装方法
首先,在http://www.yiichina.com/上下载yii 然后,配置系统环境变量,在win8下,按win+x,找到系统->高级系统设置->环境变量->path 把php的 ...
- BZOJ4977: [[Lydsy1708月赛]跳伞求生(不错的贪心)
4977: [[Lydsy1708月赛]跳伞求生 Time Limit: 5 Sec Memory Limit: 256 MBSubmit: 446 Solved: 142[Submit][Sta ...