VBA如何判断一个Activex Ocx控件或Dll有否注册
- 2017-09-09 14:07:00
- zstmtony 原创
- 10136
在Access或Excel中使用Activex控件比较不方便的地方是需要先安装Activex控件,可以做个安装程序自动来安装这些控件,但Access或Excel VBA在启动时能否自动判断 一下,指定的Activex 控件(微软的OCX控件或第三方的OCX控件,甚至DLL)有否在系统中正常注册了,如果已经安装并注册了,就不需要调用安装程序,如果没有注册,就自动打开安装程序安装一次
我们的Access通用开发平台就是使用这种方法来判断的
那VBA如何判断一个Activex Ocx控件或Dll有否注册呢? 我能想到的有几种方法
1.最粗暴的方法就是创建ocx或dll对象看看有否出错
如果不提示错误就说明控件存在并注册了,否则就是没有注册,即使用错误处理方法来判断
需要先知道控件的类名,这个在控件属性中很容易查到
on error resume next dim objTmp as object set objTmp=createobject("库名.类名") if objTmp=nothing then msgbox "未注册" else msgbox "已注册" end if但这种办法偶尔会失效的。并不是非常稳定可靠
2.从系统注册表中查看ocx控件或dll对象对应的注册表 ClassID或CLSID是否正确
原理:OCX文件是一个动态链接库(其实COM组件就是DLL),regsvr32做的只是加载这个文件,然后调用其中的DllRegisterServer函数,所有的注册操作其实是在组件自身的DllRegisterServer函数中进行的,也就是说,其实并不知道DllRegisterServer到底做了什么操作,如果想判断一个组件是否已经注册如果知道这个组件中的某个对象的ClassID或者ProgID。那直接在注册表的HKEY_CLASSES_ROOT\CLSID键中查找ClassID或在HKEY_CLASSES_ROOT键中查找ProgID就可以了,如果找到就表明已经注册了。
还有要注意版本问题,也就是说,如果做了二进制兼容,可能是新旧版本用的是同一个ClassID.在注册表HKEY_CLASSES_ROOT\CLSID键中查找HKEY_CLASSES_ROOT\CLSID\{.....}\InprocServer32默认值是这个组件文件路径的CLSID就是你要找的。
首先大家要先在网上找一个注册表读写的类,这个百度一下,非常多,代码比较长,这里就不多说了,只列出关键的代码
'通过注册表的ClsId来检查ActiveX是否正常注册 Public Function gf_CheckOcxByClsId(strClsIdOrName As String, Optional intType As OcnCheckOcxType = ocnCheckClassId, Optional strRegValue As String = "", Optional lngKey64Or32 As RegReadWOW64Constants = KEY32) As Boolean If intType = ocnCheckClassId Then Dim clsRegEdit As New clsSysRegEditNew Dim strReg As String gf_CheckOcxByClsId = False 'strReg = clsRegEdit.GetString(HKEY_CLASSES_ROOT, "CLSID" & strClsIdOrName & "\ProgID", "") Dim lngRtn As Long With clsRegEdit 'Access交流网通用开发平台的注册表处理类 .OpenKey HKCR, "CLSID" & strClsIdOrName & "\ProgID", lngKey64Or32 lngRtn = .SystemError() If lngRtn = 0 Then strReg = .QueryValue("") '取默认值 节点值 End If .CloseKey End With If strReg <> "" Then If strRegValue <> "" Then If strReg = strRegValue Then gf_CheckOcxByClsId = True End If Else gf_CheckOcxByClsId = True End If End If Set clsRegEdit = Nothing Else If CheckOcxByClsName(strClsIdOrName) Then gf_CheckOcxByClsId = True End If End If End Function
相关知识:
判断 Activex ocx控件或dll是否注册的相关办法
使用错误处理
set obj=createobject("project1.class1")
能创建的就可以
或者找注册表
注册表中的信息
当一个组件注册后,我们就可以通过前期绑定或者后期绑定来使用。事实上,组件注册后会在注册表中写入大量的信息,理解这些,对于后面的章节都有很大的帮助
当一个组件注册后,比如该组件的工程名project,类名class1,会在注册表中的以下位置出现:
HKEY_CLASSES_ROOT\project.class1和HKEY_CLASSES_ROOT\CLSID
在HKEY_CLASSES_ROOT\project.class1这个键下面,会看到Clsid子项。而这个子项会出现在HKEY_CLASSES_ROOT\CLSID下面,从而使两部分相联系起来。
这个主要是为了OLE和早期COM的兼容。
还有HKEY_CLASSES_ROOT\TypeLib和HKEY_CLASSES_ROOT\Interface
看看HKEY_CLASSES_ROOT\CLSID下面,找到我们刚才在HKEY_CLASSES_ROOT\
project.class1看到的Clsid,比如是{A85899CB-A752-40AA-9F38-DCC4384C5EBD}
我们对下面的一些子项进行说明,请注意根据组件的不同,子项也会有不同
ProgID:程序标志,由项目名称和类名两部分组成。如: project.class1
LocalServer32:进程外组件,如ActiveX EXE这样的进程外服务器中的组件需要该子键
该子键保存了服务器文件的物理路径。
InprocServer32:进程内组件,如ActiveX DLL这样的进程内服务器中的组件需要该子键
该子键保存了服务器文件的物理路径。
TypeLib:类型库。它所对应的数据在HKEY_CLASSES_ROOT\TypeLib下面互相联系。
Vb的工程->引用对话框,就是通过该键来填充列表的。
- office课程播放地址及课程明细
- Excel Word PPT Access VBA等Office技巧学习平台
- 将( .accdb) 文件格式数据库转换为早期版本(.mdb)的文件格式
- 将早期的数据库文件格式(.mdb)转换为 (.accdb) 文件格式
- KB5002984:配置 Jet Red Database Engine 数据库引擎和访问连接引擎以阻止对远程数据库的访问(remote table)
- Access 365 /Access 2019 数据库中哪些函数功能和属性被沙箱模式阻止(如未启动宏时)
- Access Runtime(运行时)最全的下载(2007 2010 2013 2016 2019 Access 365)
- Activex控件或Dll 在某些电脑无法正常注册的解决办法(regsvr32注册时卡住)
- office使用部分控件时提示“您没有使用该ActiveX控件许可的问题”的解决方法
- RTF文件(富文本格式)的一些解析
- Access树控件(treeview) 64位Office下出现横向滚动条不会自动定位的解决办法
- Access中国树控件 在win10电脑 节点行间距太小的解决办法
- EXCEL 2019 64位版(Office 2019 64位)早就支持64位Treeview 树控件 ListView列表等64位MSCOMMCTL.OCX控件下载
- VBA或VB6调用WebService(直接Post方式)并解析返回的XML
- 早期PB程序连接Sqlserver出现错误
- MMC 不能打开文件C:/Program Files/Microsoft SQL Server/80/Tools/Binn/SQL Server Enterprise Manager.MSC 可能是由于文件不存在,不是一个MMC控制台,或者用后来的MMC版
- sql server连接不了的解决办法
- localhost与127.0.0.1区别
- Roych的浅谈数据库开发系列(Sql Server)
- sqlserver 自动备份对备份目录没有存取权限的解决办法
- 安装Sql server 2005 express 和SQLServer2005 Express版企业管理器 SQLServer2005_SSMSEE
联系人: | 王先生 |
---|---|
Email: | 18449932@qq.com |
QQ: | 18449932 |
微博: | officecn01 |