ActiveX组件无法创建对象。

36

我刚刚在我的Windows Server 2008服务器上安装了一个第三方应用程序,但当我尝试使用VBScript的CreateObject访问时,出现

ActiveX组件无法创建对象

���错误消息。

该应用程序已确定已安装并存在于"程序和功能"下。有人能提供一份检查问题的清单吗?

我现在尝试使用regsvr32.exe /i bob.dll注册DLL,但我得到以下错误:

模块"Bob.dll"已加载,但未找到入口点DllRegisterServer。

请确保"Bob.dll"是有效的DLL或OCX文件,然后重试。

需要注意的是,这是在64位机器上运行的32位应用程序。但在我的Windows XP 32位机器上可以正常运行。

12个回答

50

事实证明,在VBScript下使该应用程序运行,我需要做两件事情。

  1. 运行RegAsm.exe来注册DLL文件。
  2. 运行C:\Windows\SysWOW64\cscript.exe来运行我的VBScript。

如果这些方法不起作用,请查看这里关于在IIS中启用32位应用程序的其他答案


3
不错的救援!我在这个问题上纠结了20分钟。32位解释器缺乏有用的错误信息,让我有些沮丧。 - Eric
@JeroenLandheer,让它更像2小时:P - Carlos
3
如果有人像我一样想知道“为什么要使用cscript而不是wscript?”:cscript就像wscript一样,但Wscript.Echo输出到控制台而不是消息框。 - bluish
2
@Gordyll,我在哪里可以找到RegAsm.exe? - iOSAndroidWindowsMobileAppsDev
另一件事是确保位兼容性。我的编译器正在使用“任何CPU”,而实际上客户要求的MS Office应用程序是64位的。之后,它可以在不需要注册表的情况下正常工作(可以在Visual Studio的编译时设置)。 - Rob
@iOSAndroidWindowsMobileAppsDev RegAsm.exe 可在 C:\Windows\WinSxS\ 目录下找到。在我的系统中,它位于 C:\Windows\WinSxS\x86_regasm_<一些字母数字值>\RegAsm.exe - cse

40

同时,值得检查的是在IIS的DefaultAppPool的高级设置中,确保"启用32位应用程序"设置为True。


2
我同意@LeeEnglestone的观点。它在高级设置 > (常规) > 启用32位应用程序中。 - Mario Tacke

9

该应用程序正在尝试创建一个COM对象,即使该COM DLL存在,它也可能依赖于另一个未安装的DLL。您可以使用DependencyWalker来确定是否存在这种情况。


6

检查您的浏览器设置。

对于我来说,使用IE浏览器,解决方法是进入“工具/Internet选项”,选择安全选项卡,针对相关区域,点击“自定义级别”按钮并检查ActiveX控件设置。将“未标记为安全脚本的ActiveX控件的初始化和执行脚本”设置为“启用”即可解决此问题。


但这样会使它在您的浏览器中工作...您不能指望所有用户都这样做才能使用您的网站,那不是有点无用吗? - Naoise Golden
对于许多应用程序而言,这是无用的。但例如在我们的环境中,我们的浏览器应用程序仅在我们公司中使用--因此我们对设置具有控制权。(这是一个旧程序,不一定最优,但它能够运行。) - JemWritesCode

5

当您注册组件时,请确保使用32位版本的regsvr32.exe。

如果您只是在提升的提示符下运行regsvr32.exe,则会默认采用标准的64位版本(奇怪的是,它位于C:\ Windows \ System32中)

我相信您需要的版本位于C:\ Windows \ SysWow64 \ regsvr32.exe中


1
谢谢提醒;我遇到了与楼主类似的情况,你的评论对我很有帮助。 - E. Rodriguez

3

看起来你引用的对象未在系统中注册。虽然你说它已经安装,但这并不一定意味着它已经注册。为了确认这一点,请在注册表中搜索你使用的progID。

以下是此代码的示例:

set objFSO = CreateObject("Scripting.FileSystemObject") 

我会在注册表中搜索“Scripting.FileSystemObject”。然后,我会查看找到的值上面的注册表键,以获取“InProcServer32”值。这将为您提供已注册的ActiveX文件的路径(对于“Scripting.FileSystemObject”,该文件是“c:\ windows \ system32 \ scrrun.dll”)。
如果您在注册表中找不到您的progID,则说明它未在您的系统上注册,这就是您的问题所在。如果未注册,则需要找出注册它的文件是什么,通常是第三方应用程序的相同文件夹路径中的.ocx或.dll文件,然后注册这些文件。以下是注册文件的命令:
regsvr32 /i "c:\windows\system32\scrrun.dll"

即使您在注册表中找到了progID值并且它引用了系统上存在的文件,您仍然可能希望尝试重新注册该文件。我发现有时候注册过程会出现问题,重新注册文件比修复问题更容易。


2
如果是32位的COM/Active X,请使用位于C:\Windows\SysWOW64\的cscript.exe/wscript.exe 32位版本。

1

我知道这是一个旧的帖子,但有没有人检查过他们的杀毒软件是否在系统上阻止Win32API和脚本?我在办公系统上安装了CylanceProtect,并发现与其他人列出的问题相同。如果您检查事件查看器中的Windows日志,可以确认此问题。


感谢您发布这篇文章。我们最近开始使用Cylance,但它对我们的宏文件造成了问题。 - Smog

0

我在使用Excel时遇到了同样的问题,我试图在Excel 64位版本中使用32位COM DLL,结果出现了这个错误。我将COM dll重建为64位版本,错误消失了。因此,请确保您的COM dll与应用程序具有相同的架构(x86 vs x64)。


0

我也遇到了这个问题。我试图在64位系统中运行一个旧的32位dll文件。我通过将.dll文件复制到C:\Windows\SysWoW64\目录并运行以下命令来解决了这个问题:

%systemroot%\SysWoW64\regsvr32 "C:\Windows\SysWoW64\thenameofyourdll.dll"

还有启用IIS运行32位应用程序


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接