试图通过指向COM接口的智能指针来调用函数

时间:2014-07-10 09:04:21

标签: c++ com smart-pointers

我遵循Microsoft教程here(在SO的帮助下)从C ++代码调用COM对象。

教程的第9步说:

  

要调用托管DLL,请将以下代码添加到_tmain   功能:

// Initialize COM.
HRESULT hr = CoInitialize(NULL);

// Create the interface pointer.
ICalculatorPtr pICalc(__uuidof(ManagedClass));

当我在我的文件中使用这些代码行时,它们工作正常,我成功调用了COM接口上的函数。

现在,我需要在2个静态函数中访问pICalc,所以我想把它变成一个静态类变量(我知道静态在这句话中有2个不同的含义)。

这是我的代码:

在MyCPlusPlusClass.h中:

static ICalculatorPtr* pICalc;

在MyCPlusPlusClass.cpp中:

//Pointer definition
ICalculatorPtr* MyCPlusPlusClass::pICalc;

并在静态函数中:

pICalc = new ICalculatorPtr(__uuidof(ManagedClass));

但是当我尝试使用

调用函数时
(*pICalc)->SomeICalcFunction();

我得到了

  

_com_issue_error(Int32)位于_com_ptr_t ...

我主要是C#程序员,所以我只是在C ++中犯了一个愚蠢的语法错误?

编辑: 在.tlh文件中,有

struct __declspec(uuid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")) _ManagedClass

_COM_SMARTPTR_TYPEDEF(ICalc, __uuidof(ICalc));
_COM_SMARTPTR_TYPEDEF(_ManagedClass, __uuidof(_ManagedClass));

virtual HRESULT __stdcall SomeICalcFunction (BSTR * pRetVal) = 0;

1 个答案:

答案 0 :(得分:1)

好的,我想,您必须执行以下操作。

在MyCPlusPlusClass.h中:

变化

static ICalcPtr* pICalc;

static ICalcPtr pICalc;

在MyCPlusPlusClass.cpp中:

变化

//Pointer definition
ICalcPtr* MyCPlusPlusClass::pICalc;

ICalcPtr MyCPlusPlusClass::pICalc;

在所有静态函数中:

if(pICalc == NULL)
{
    if(FAILED(pICalc.CreateInstance(__uuidof(ManagedClass))))
        std::cout << "Can't create pICalc" << std::endl;
}

然后使用:

pICalc->SomeICalcFunction();

我真的不明白为什么你需要静态功能。使所有它们都是非静态的,而pICalc也是非静态的。那会更清洁。