检索具有CLSID {AD37B7D5-B5A3-460A-8FFB-3C71984A4537}的组件的COM类工厂因以下错误而失败:80040154。
异常详情:
System.Runtime.InteropServices.COMException:由于以下错误,检索具有CLSID {AD37B7D5-B5A3-460A-8FFB-3C71984A4537}的组件的COM类工厂失败:80040154。
我在ASP.NET Web应用程序中使用了A COM DLL。我成功地使用我自己的开发机器和构建机器 但是,当我尝试将项目部署到另一台计算机(Microsoft Windows Server 2003 R2)时,我收到上述错误。
我已使用regsvr32命令注册了COM DLL。它说DLL已成功注册。
我正在使用ASP.NET 3.5版在Visual Studio 2008中开发项目,并构建我的项目以在任何CPU上运行,每台计算机使用64位Windows。 我正在使用IIS 6.0版 (我尝试启用IIS来运行32位应用程序,这导致Web应用程序不可用。)
我编写了一个Windows脚本文件来检查COM DLL工作与否的天气(即独立于项目)。 这个脚本在我的构建机器和我自己的开发机器上运行良好 但是它在我遇到问题的机器上运行不正常(Microsoft Windows Server 2003 R2)。 我必须做的是使用以下命令(我找到here)从命令行运行脚本:
C:\WINDOWS\SysWOW64\wscript.exe COMtest.js
以这种方式运行时,wscript文件可以成功运行 我认为它与构建COM DLL的版本有关。
我是否需要在Visual Studio项目中启用某些设置?
(请注意我自己没有构建COM DLL。其他人已经构建了它并将它提供给我。)
答案 0 :(得分:4)
这是COM的FileNotFound错误。在这种情况下,它很可能是一个小问题。注册表使32位和64位服务器的COM注册保持独立。当您从syswow64目录运行wscript.exe时,它强有力地表明它是32位可执行文件的主页。 64位进程将无法在注册表中找到32位服务器。它也不能使用它。通过运行c:\ windows \ system32 \ wscript.exe
来重新编译首先必须构建COM服务器的x64版本,以便64位进程可以使用它。然后,您必须使用64位版本的Regsvr32.exe(c:\ windows \ system32,而不是syswow64)注册它。如果仍有问题,请使用SysInterals的ProcMon实用程序查找进程在注册表和文件系统中的位置。
或者让IIS以32位模式运行。这是另一个需要不同标签的问题。
答案 1 :(得分:1)
我通过为dll创建COM +应用程序来修复此问题。
答案 2 :(得分:0)
使用第三方.dll文件时收到80040154错误。最后,我发现错误是尝试API禁止的调用的结果 - Visual Studio让我觉得它们没问题。因此,一个答案可能是使用dll文档检查您的API调用是否正确,即RTFM!
以为我会添加这个,因为它可能会节省一些宝贵的时间。