如何解决未注册的COM异常类(来自HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG))?


92

当我尝试创建COM类的实例时,它将引发异常

未注册类(HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG))

请提出我该如何解决?


1
您能用一些代码给出更多细节吗?
Xaisoft

10
有两个问题:1.您是否在Windows 7 x64计算机上安装/注册了COM组件?2.您的应用程序的目标平台是什么,我认为您应该将该平台设置为x86,请不要将其设置为“任何CPU”?请先注册COM,然后运行以测试该应用程序,请参考文档:support.microsoft.com/kb/146219和Regsvr32使用说明和错误消息
JackWang 2012年

我解决了该问题,而没有将构建目标更改为“ x86”。链接中的解决方案:< stackoverflow.com/a/55513690/11310933 >
Sunil Xtha

Answers:


48

似乎您尝试初始化的程序或进程中的任何一个均未安装在计算机上,安装已损坏或需要注册。

安装,修复(通过“添加/删除程序”)或注册(通过Regsvr32.exe)。

您没有为我们提供足够的信息来帮助您。


4
以为您的意思是RegSvr32.exe(与RegSrv32.exe相反)。
windowsgm 2013年

60

您需要确保所有程序集都针对正确的体系结构进行编译。如果无法重新安装COM组件,请尝试更改x86的体系结构。


这解决了我的过程,找不到NAV 2009 R2客户端(ClassID 50000004-0000-1000-0001-0000836BD2D2)。
Vincent Vancalbergh

14

我的问题和解决方案

我有一个32位第三方dll,它已在64位的2008 R2计算机中安装。

我在.net 4.5框架中创建了一个wcf服务,该服务调用32位第三方dll进行处理。现在,我将build属性设置为以“ any” cpu为目标,并将其部署到64位计算机上。

当我尝试调用wcf服务时收到错误“ 80040154类未注册(HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG“

现在,我使用ProcMon.exe来跟踪com注册表问题,并确定该进程正在HKLM \ CLSID和HKCR \ CLSID处查找没有条目的注册表项。

知道Microsoft不会将32位com组件注册到64位计算机中的路径HKLM \ CLSID,HKCR \ CLSID,而是将条目放置在HKLM \ Wow6432Node \ CLSID和HKCR \ Wow6432Node \ CLSID路径中。

现在,冲突是64位进程尝试在64位计算机中调用32位进程,该进程将在HKLM \ CLSID,HKCR \ CLSID中查找注册表项。解决方案是我们必须强制64位进程查看HKLM \ Wow6432Node \ CLSID和HKCR \ Wow6432Node \ CLSID的注册表项。

这可以通过将wcf服务项目属性配置为以“ X86”计算机而非“任何”计算机为目标来实现。

在将“ X86”版本部署到2008 R2服务器后,出现问题“ System.BadImageFormatException:无法加载文件或程序集”

解决此badimageformatexception的方法是,在正确的apppool的IIS Apppool属性中将“ Enable32bitApplications”设置为“ True”。


请不要针对多个问题发布相同的答案。发表一个好答案,然后投票/标记以将其他问题重复作为一个重复。如果问题不是重复的,请定制对问题的答案
kleopatra 2015年

10

还要注意,初始化时的类上下文可以创建该异常。如果您有一个编码为INPROC_SERVER的对象,但是尝试将CoCreateInstance编码为CLSCTX_LOCAL_SERVER,则也会出现该错误。

您需要确保该对象已注册,并且CoCreateInstance正在使用正确的类上下文创建实例。


是的,例如,如果您尝试DesktopWallpaper使用CLSCTX_INPROC(而不是CLSCTX_ALL)进行创建,则会收到0x80040154 (REGDB_E_CLASSNOTREG)错误消息。
user362515 '16

9

如果在IIS上的Web应用程序中使用64位COM组件,请确保将应用程序池设置为不允许32位应用程序(启用32位应用程序:高级设置中为false


5

我通过在“应用程序池”高级设置中启用32位应用程序来使其工作。右键单击应用程序池,然后选择高级设置-启用32位应用程序。这可能会帮助某人。


我也是。在64位开发者计算机,64位测试和64位实时服务器上使用的32位dll。在开发箱上工作正常。当部署到测试服务器和实时服务器时,它失败,直到相应的IIS应用程序池中允许使用32位应用程序,然后重新启动了这些池。我还必须关闭“嵌入互操作类型”(VS中有问题的dll的设置),并设置“ Copy Local” = true,以确保该dll实际上以其原始形式复制到了服务器。
cymorg '16


3

就我而言

my platform 是x64

the Dll library(sdk)并且redistributable package是x64

所以

  1. 在解决方案资源管理器中 navigate to your project

  2. 打开 Properties

  3. change the Platform target from AnyCPU to x64

在此处输入图片说明


2

我解决此问题的方法是注册COMvia regsvr32

确保您要调用的COM已注册。

我的应用程序正在使用xceedcry.dll,但没有注册。一旦注册,该应用程序就可以正常运行。


2

我的解决方案是在IIS中相对应用程序池的高级设置中将“ 启用32位应用程序 ”更改为True。

应用程序池

启用32位应用程序


2

就我而言,该类已正确注册并以任何CPU / 64位模式构建 。

但是使用该类的应用程序的IIS应用程序池的“ 启用32位应用程序”属性设置为True

未找到类,因为应用程序池配置和实际注册的类之间的体系结构不匹配。

将“ 启用32位应用程序”设置为False可以解决此问题。 IIS应用程序池设置



1

我在使用MapWinGis时遇到了同样的问题。我找到了解决方案,可以在Visual Studio 2015 Windows窗体proyect上工作,只需右键单击proyect-> properties-> Build,将配置设置为All configuration,然后在conbobox“平台目标”中将其设置为x64。


0

我遇到了一个问题,即通过COM从C ++客户端调用.Net程序集。事实证明,找不到.Net程序集所依赖的程序集之一。我挣扎了一段时间,试图找出第一个程序集出了什么问题,但这实际上是第一个程序集的依赖项之一。从C ++客户端调用CoCreateInstance()时,我收到两个不同的错误。第一个是: REGDB_E_CLASSNOTREG未注册的类 ,第二个尝试是: 0x80131040:找到的程序集的清单定义与程序集引用不匹配。

因此,请检查程序集的引用是否存在。我通过使用dotPeek浏览第一个程序集并注意到其中的一个引用丢失了这一点。将正确版本的依赖项放在文件夹中可以解决这两个错误。


0

我正在编译针对任何CPU的应用程序,主要问题原来是安装了旧版本的v10.x的 adobe reader 需要升级 v11.x,这是解决此问题的方法。


0

我在运行时使用COM类遇到了相同的问题,即“类未注册的异常”。对我而言,我能够通过转到app.config文件来解决并将“ startup”和“ supportedRuntime”元素更改为类似以下内容:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

您可以在此处阅读有关详细信息的更多信息http://stackoverflow.com/questions/1604663/

和这里https://msdn.microsoft.com/en-us/library/w4atty68(v=vs.110).aspx

我应该注意我正在运行Visual Studio2017。目标cpu = x86 Embed Interop Type = true(在属性窗口中)



0

我也遇到过同样的问题。经过一些研究后,我找到了解决方案,它可能有用。根据我的观察,这个问题不仅与重新安装有关,还取决于访问权限。

步骤1:修复特定的COM对象。

步骤2:组件服务>计算机>我的电脑> DCOM Config>选择您的COM对象>右键单击>属性>安全性选项卡>访问权限>选择自定义>单击EDIT>选择IIS_USER(如果不存在,请创建具有完整权限的文件)并提供完整权限访问并单击确定。

移至“身份”选项卡>您可以选择“交互式用户”或“此用户”>单击应用,然后单击确定。如果您选择“此用户”,我们必须将该服务器授予“管理”特权用户

步骤3:打开IIS管理器>重新启动应用程序池。

注意:如果需要,请重新启动服务器


-1

在这里找到解决方案,运行mmc -32工具(不是dcomcfg)

在具有32位Office的64位系统上,请尝试以下操作:

Start
Run
mmc -32
File
Add Remove Snap-in
Component Services
Add
OK
Console Root
Component Services
Computers
My Computer
DCOM Config
Microsoft Excel Application

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.