Com Initialization Error 0x80040154 loading c# COM Object with c++ Program

Posted

技术标签:

【中文标题】Com Initialization Error 0x80040154 loading c# COM Object with c++ Program【英文标题】: 【发布时间】:2010-08-23 18:59:15 【问题描述】:

我正在处理我的第一个 COM 项目,该项目将带有 C# COM Wrapper 类的 c# DLL 导入到 C++ 本机代码应用程序中。我们的应用程序基于来自 Microsoft 的All-In-One Framework 的 CSRegFreeCOMServer VS2008 示例项目。我们的系统正在使用 - VS2008、.Net3.5、boost 1.4.2 和 Qt 4.6.2。

此应用程序在我们的 32 位 XP 开发盒上运行良好。但是,当我们将系统加载到我们的 Windows 7-64 位系统时。我们无法让 com 对象初始化。我们不断收到错误 0x80040154(我似乎无法确定它的含义)。

我们的头文件是-

#ifndef ControlComInterface_h__
#define ControlComInterface_h__
#include <string>
#include <ole2.h>    // OLE2 Definitions
// Importing mscorlib.tlb is necessary for .NET components
// see: 
//  http://msdn.microsoft.com/en-us/library/s5628ssw.aspx
#import "mscorlib.tlb" raw_interfaces_only                \
    high_property_prefixes("_get","_put","_putref")        \
    rename("ReportEvent", "InteropServices_ReportEvent")
using namespace mscorlib;
// import the COM Declarations exported com the CSRegFreeCOMServer
#import "..\CSRegFreeCOMServer\bin\Release\CSRegFreeCOMServer.tlb"  no_namespace named_guids
using namespace std;
class ControlComInterface

public:
    ControlComInterface(void);
    ~ControlComInterface(void);
    IFieldsPtr spFields;
    IPchFilePtr spPchFileWrapper;
    bool CreateInterfaceObjects(string &errorMsg);
;
#endif // ControlComInterface_h__

简化的类代码是

    #include "ControlComInterface.h"
#include <boost/lexical_cast.hpp>
ControlComInterface::ControlComInterface(void)
        
ControlComInterface::~ControlComInterface(void)
        
bool ControlComInterface::CreateInterfaceObjects( string &errorMsg )

HRESULT hr = S_OK;
hr = ::CoInitialize(NULL);  
if (FAILED(hr))

    errorMsg = "CoInitialize failed w/err: ";
    errorMsg.append(boost::lexical_cast<string>(hr));
    return false;
    
errorMsg = "";
hr = spFields.CreateInstance(__uuidof(Fields));
if (FAILED(hr))
    
    errorMsg = "IFields::CreateInstance failed w/err: ";
    errorMsg.append(boost::lexical_cast<string>(hr));
    return false;
    
return true;

代码在调用spFields.CreateInstance(...) 时失败,错误代码为 0x80040154,这只是使用默认构造函数在 com 对象中创建类的实例。

建议?

【问题讨论】:

【参考方案1】:

0x80040154 是REGDB_E_CLASSNOTREG。即类未注册。

COM 找不到(在注册表中)具有 CLSID = __uuidof(Fields) 的类工厂。

【讨论】:

以上是关于Com Initialization Error 0x80040154 loading c# COM Object with c++ Program的主要内容,如果未能解决你的问题,请参考以下文章

TensorRT报Cuda initialization failure with error

TensorRT报Cuda initialization failure with error

error: crosses initialization of

pl/sql 连接数据库报错。initialization error oracle client not properly installed

PL/SQL developer 连接oracle数据库报错“initialization error could not load oci.dll”

xmanager安装出错,提示error reading setup initialization file 是啥原因