vba - 已注册的 COM DLL 在 VBA 中有效,但在 VBScript 中无效

标签 vba dll vbscript com

我在 VS2012 上用 ATL 创建了一个基本的 COM DLL。它叫做 testCOM.dll,它只有一个类叫做 CSimpleObj。 CSimpleObj 只有一种称为 addValues 的方法,它添加两个值。

我已经使用 Windows 7 64 位注册了 DLL。在 VBA 中,我手动添加了对 DLL 的引用,下面的代码可以正常工作

Dim Obj As New testCOMLib.SimpleObj
MsgBox Obj.addValues(1,2)

它给出了一个数字为 3 的消息。

现在,如果我运行包含以下内容的 vbs:

Dim Obj
Set Obj = CreateObject("testCOMLib.SimpleObj")

它经常报错,无法创建对象。但是,如果我将 "Excel.Application" ProgID(作为示例)用于 CreateObject 方法,它就可以正常工作。

我认为注册 DLL 有问题。我检查了注册表,COM 和类型库的 key 已经存在。

我该怎么办?

最佳答案

要使您的 COM 服务器可从 VBScript 使用,需要满足三个基本要求:

  • 您需要实现 IDispatch,以便支持后期绑定(bind)。 ATL 通常不是问题,它会在您使用向导时默认实现它。

  • 您的注册表脚本 (.rgs) 必须将 ProgId 写入注册表。值得注意的是,您没有报告找到它(使用 Regedit.exe 查找 HKCR\testCOMLib.SimpleObj 进行验证)。它的 CLSID 子项必须与注册表中的 CLSID 匹配,这样 COM 才能找到您的 DLL。 ATL 简单对象向导有一个陷阱,它会在您键入短名称时填写所有字段。 ProgID 字段除外。很容易忘记。

  • 在 64 位版本的 Windows 上,您将默认执行 64 位版本的 cscript.exe。它将无法找到您的 32 位 COM 服务器。您需要构建 x64 版本的服务器,或者需要使用位于 c:\windows\syswow64 中的 32 位版本的 cscript.exe。 VBA 通常不是问题,因为它通常用于 32 位版本的 Office。

SysInternals 的 Process Monitor 实用程序对于诊断此类问题非常有用。您将看到 cscript.exe 在注册表中搜索您的服务器注册的 key 。并且可能找不到它们,但是您对收到的实际错误消息不够明确。

关于vba - 已注册的 COM DLL 在 VBA 中有效,但在 VBScript 中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24143406/

相关文章:

excel - 将单元格格式化为其他单元格时出现错误 `xlValues` is not defined

vba - 如何在 VBA 中使用方括号进行字符串计算?

Excel-VBA : Variable Names, 匈牙利符号和变量命名最佳实践

excel - 使用 VBA 将 Excel 图表粘贴到 Powerpoint 中

java - 在 Linux 上的 Java EE 应用程序中调用 dll 文件

windows - CreateUpdateDownloader 如何知道下载哪些文件?

vba - 使用调整大小和复制来复制列宽

visual-studio - 无效的MEX(找不到指定的过程): Building a CUDA MEX function in visual studio and calling it in MATLAB

delphi - FASM - 将字符串传递给 Delphi DLL

audio - 为什么在Windows 7 PC上无法使用vb脚本使声音静音?