Com初始化错误0x80040154使用c ++程序加载c#COM对象

时间:2010-08-23 18:59:15

标签: c# c++ com

我正在开发我的第一个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-64bit系统上时。我们无法让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 个答案:

答案 0 :(得分:1)

0x80040154是REGDB_E_CLASSNOTREG。也就是说,课程没有注册。

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