如何将COM接口指针转换为void指针然后返回COM指针?这是一些代码来说明我的问题。它与此示例代码非常相似:_com_ptr_t assignment in VC++
CoInitialize(NULL);
COMLib::ICalcPtr pCalc = COMLib::ICalcPtr("MyLibrary.Calculator");
pCalc->doSomething();
CoUninitialize();
return 0;
现在,如果我要将pCalc
对象转换为void*
,我该如何将其转回COMLib::ICalcPtr
?例如,以下代码中的第二行给出了编译错误'QueryInterface':不是'System :: Void'的成员。显然,它试图在对象上调用IUknown.QueryInterface()
。我希望在不创建新界面的情况下执行此操作(因此,无需隐式调用QueryInterface
和AddRef
)。
void *test = pCalc;
COMLib::ICalcPtr pCalc2 = test;//'QueryInterface' : is not a member of 'System::Void'
仅供参考,我这样做的原因是该对象将作为void*
类型从java传递到jni VC ++代码。我对任何关于该怎么做或在幕后发生什么的建议持开放态度。
答案 0 :(得分:0)
同样地传递任何其他不适合指针或不易转换的不透明结构:通过传递其地址。
void* test = new COMLib::ICalcPtr(pCalc);
...
COMLib::ICalcPtr pCalc2 = *(COMLib::ICalcPtr*)test;
delete (COMLib::ICalcPtr*)test;
这会调用AddRef
和Release
,但不会调用QueryInterface
。