注册COM DLL工作在VBA但不是在VBScript(Registered COM DLL wor

2019-10-20 06:44发布

我已经创建与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"进程id(作为例子)的CreateObject方法,它工作正常。

我认为这是与注册DLL的问题。 我检查注册表,并为COM和类型库的钥匙已经存在。

我该怎么办?

Answer 1:

有三个基本要求,让您的COM服务器是使用从VBScript:

  • 您需要实现IDispatch所以后期绑定的支持。 通常不与ATL的一个问题,它在默认情况下,当您使用向导实现它。

  • 你的注册表脚本(.RGS)必须写PROGID注册表。 值得注意的是,你没有报告发现它(查找HKCR\testCOMLib.SimpleObj与Regedit.exe来验证)。 它的CLSID子项必须使COM可以找到你的DLL在注册表中CLSID匹配。 ATL简单对象向导有一个陷阱,它填补了当你输入的短名称的所有字段。 除进程id字段。 因此,很容易忘记。

  • 在Windows的64位版本,你会在默认情况下执行的Cscript.exe的64位版本。 这不会是能够找到您的32位COM服务器。 你需要来完成构建服务器的x64版本或你需要使用Cscript.exe的32位版本,位于C:\ WINDOWS \ SysWow64资料。 通常不从办公室的32位版本使用VBA一个问题,因为它往往会。

该Sysinternals的进程监视器实用程序来诊断这些类型的问题是非常有用的。 你会看到的Cscript.exe寻找你的服务器中注册的键注册表。 也许还没找到他们,你不过不是你得到了实际的错误信息不够明确。



文章来源: Registered COM DLL works in VBA but not in VBScript