我遵循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;
答案 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也是非静态的。那会更清洁。