use*_*763 1 com dll vbscript vba
我在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)
Run Code Online (Sandbox Code Playgroud)
它给出了一个3号的消息.
现在如果我运行包含以下内容的vbs:
Dim Obj
Set Obj = CreateObject("testCOMLib.SimpleObj")
Run Code Online (Sandbox Code Playgroud)
它经常出错并且无法创建对象.但是如果我使用"Excel.Application"ProgID(作为示例)用于CreateObject方法,它可以正常工作.
我认为注册DLL存在问题.我已经检查了注册表,COM和类型库的键已经存在.
我该怎么办?
从VBScript获取COM服务器有三个基本要求:
您需要实现IDispatch,因此支持后期绑定.通常不是ATL的问题,它在您使用向导时默认实现它.
您的注册表脚本(.rgs)必须将ProgId写入注册表.值得注意的是,您没有报告查找它(HKCR\testCOMLib.SimpleObj使用Regedit.exe 查找以进行验证).其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在注册表中搜索您的服务器注册的密钥.并且可能没有找到它们,但是你对你得到的实际错误信息不够明确.