Я работаю над своим первым 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, используя конструктор по умолчанию.
Предложения?