我在 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/