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

Trying to call a function via a pointer to a smart pointer to a COM interface

本文关键字:一个 智能 指针 函数 调用 接口 COM      更新时间:2023-10-16

我在这里遵循Microsoft教程(在SO的一点帮助下)从c++代码中调用COM对象。

教程第9步说:

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

// Initialize COM.
HRESULT hr = CoInitialize(NULL);
// Create the interface pointer.
ICalculatorPtr pICalc(__uuidof(ManagedClass));

当我在我的文件中使用这些代码行时,它们工作得很好,并且我成功地调用了COM接口上的函数。

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

这是我的代码:

在MyCPlusPlusClass.h:

static ICalculatorPtr* pICalc;
在MyCPlusPlusClass.cpp:

//Pointer definition
ICalculatorPtr* MyCPlusPlusClass::pICalc;

和在静态函数中:

pICalc = new ICalculatorPtr(__uuidof(ManagedClass));

但是当我尝试用

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

_com_issue_error(Int32) at _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;

好的,我认为,你必须这样做。

在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也是非静态的。这样会更干净。