Ошибка инициализации Com 0x80040154 при загрузке COM-объекта c # с программой c ++ - PullRequest
1 голос
/ 23 августа 2010

Я работаю над своим первым COM-проектом, который импортирует ac # DLL с классом C # COM Wrapper в приложение с собственным кодом C ++.Наше приложение основано на примере проекта CSRegFreeCOMServer VS2008 от Microsoft All-In-One Framework .Наша система использует - 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;
}

Код не выполняется с кодом ошибки 0x80040154 при вызове spFields.CreateInstance(...), который просто создает экземпляр класса в объекте com, используя конструктор по умолчанию.

Предложения?

1 Ответ

1 голос
/ 23 августа 2010

0x80040154 - REGDB_E_CLASSNOTREG.То есть класс не зарегистрирован.

COM не может найти (в реестре) фабрику классов с CLSID = __uuidof(Fields).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...