前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VBA CreateObject函数如何找到所需要的依赖文件

VBA CreateObject函数如何找到所需要的依赖文件

作者头像
xyj
发布2020-09-10 16:10:29
2.2K0
发布2020-09-10 16:10:29
举报
文章被收录于专栏:VBA 学习

VBA中如果要调用外部对象,有2种方法:

  • 前期绑定:

在VBA编辑器里点击工具-引用,找到需要使用的项目勾选

  • 后期绑定:

使用VBA的CreateObject函数,这种情况下要知道COM对象的名称。

前期绑定的方法应该比较好理解,在Excel直接手动找到需要依赖的文件,一般是.dll后缀的,然后调用这个文件里的东西。

那么后期绑定为什么也能运行呢?

这个其实道理也是一样的,最终还是要找到那个依赖的文件,读取依赖文件里面的东西。

1、注册表

Windows系统有一种叫做注册表的东西,里面保存了很多数据信息,CreateObject函数就是通过注册表来找到依赖文件的。

以外部对象字典为例,来看看通过注册表是如何找到依赖文件的:

  • 点击电脑的开始--运行,输入cmd,然后在黑框里输入regedit,这样就打开了注册表编辑器。
  • 点击HKEY_CLASSES_ROOT,在它下面找到Scripting.Dictionary
  • 继续打开CLSID,右边就有一行内容:
  • 记录下{EE09B103-97E0-11CF-978F-00A02463E06F}
  • 在HKEY_CLASSES_ROOT下面找到CLSID,打开它,可以看到有很多类似上面那串数据的东西,在里面找到它(按字母顺序排序的)
  • 找到后继续展开InprocServer32,可以看到右边有了一个dll的路径,这个也就是前期绑定需要引用的依赖文件

所以,前期绑定和后期绑定最终都是需要引用这个C:\Windows\system32\scrrun.dll,只是后期绑定在运行的时候去查找,而前期绑定是在运行之前就已经找好了。

2、使用VBA读取注册表

如果还想知道其他的外部对象所引用的具体文件,用上面的方法自然可以找到,但是这样手动查找挺麻烦的,看看使用VBA如何来读取注册表信息:

代码语言:javascript
复制
Private Function GetObjectDllPathByWSCript(ObjectName As String) As String
    Dim ws As Object
    
    Set ws = VBA.CreateObject("WScript.Shell")
     
    Dim clsid As String
    clsid = ws.RegRead("HKEY_CLASSES_ROOT\" & ObjectName & "\CLSID\")
    
    Dim dllpath As String
    dllpath = ws.RegRead("HKEY_CLASSES_ROOT\CLSID\" & clsid & "\InprocServer32\")
    GetObjectDllPathByWSCript = dllpath
    
    Set ws = Nothing
End Function

使用WScript.Shell外部对象读取注册表的信息比较简单,只要正确找到注册表路径即可。

这里只用到了RegRead,更多信息可以引用C:\Windows\SysWOW64\wshom.ocx后,使用对象浏览器查看:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 VBA 学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档