已注册的COM DLL在VBA中工作,但在VBScript中不工作

已注册的COM DLL在VBA中工作,但在VBScript中不工作,vba,dll,vbscript,com,Vba,Dll,Vbscript,Com,我已经在VS2012上用ATL创建了一个基本COM DLL。它名为testCOM.dll,只有一个名为CSimpleObj的类。CSimpleObj只有一个名为addValues的方法,它将两个值相加 我已经用64位Windows 7注册了DLL。在VBA中,我手动添加对DLL的引用,下面的代码可以正常工作 Dim Obj As New testCOMLib.SimpleObj MsgBox Obj.addValues(1,2) 它会给出一个数字为3的信息 现在,如果我运行vbs,其中包括:

我已经在VS2012上用ATL创建了一个基本COM DLL。它名为testCOM.dll,只有一个名为CSimpleObj的类。CSimpleObj只有一个名为addValues的方法,它将两个值相加

我已经用64位Windows 7注册了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和类型库的键已经在那里了


我应该怎么做?

要使COM服务器从VBScript中可用,有三个基本要求:

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

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

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


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

要使COM服务器能够从VBScript中使用,有三个基本要求:

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

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

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


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

dll中的接口和类属性是什么。整个项目COM是否可见并正确注册?如果对象未正确注册,请尝试设置myCOMobj=GetObject(“C:\pathToMyCOM.dll”)然后
myCOMobj.addValues(1,2)
。还要确保您没有实际使用来自的MSgBoxVBScript@mehow没有属性。就这么简单。该接口仅由一个类实现。整个COM项目可见是什么意思?我在注册表中搜索了我的CLSID,它在类型库(testCOMLib)下。您不能在Excel中添加引用,然后尝试后期绑定,如
CreateObject(“testCOMLib.SimpleObj”)
?在Excel中工作吗?请通过c:\windows\syswow64\cscript.exe xxx.vbs进行尝试?您的COM库是否支持IDispatch(后期绑定)?您需要IDispatch支持才能使其与VBScript一起工作。如果您尝试在VBA中使用
CreateObject
,则很可能在那里也不起作用。dll中的接口和类属性是什么。整个项目COM是否可见并正确注册?如果对象未正确注册,请尝试设置myCOMobj=GetObject(“C:\pathToMyCOM.dll”)然后
myCOMobj.addValues(1,2)
。还要确保您没有实际使用来自的MSgBoxVBScript@mehow没有属性。就这么简单。该接口仅由一个类实现。整个COM项目可见是什么意思?我在注册表中搜索了我的CLSID,它在类型库(testCOMLib)下。您不能在Excel中添加引用,然后尝试后期绑定,如
CreateObject(“testCOMLib.SimpleObj”)
?在Excel中工作吗?请通过c:\windows\syswow64\cscript.exe xxx.vbs进行尝试?您的COM库是否支持IDispatch(后期绑定)?您需要IDispatch支持才能使其与VBScript一起工作。如果您尝试在VBA中使用
CreateObject
,它可能也不会在那里工作。谢谢。。在我的例子中,由于64位机器,它无法工作。从c:\windows\syswow64调用cscript后,我可以成功运行脚本。谢谢你,谢谢。。在我的例子中,由于64位机器,它无法工作。从c:\windows\syswow64调用cscript后,我可以成功运行脚本。非常感谢。