将_com_ptr_t转换为void *,然后返回_com_ptr_

时间:2014-05-08 22:57:02

标签: visual-c++ com-interop

如何将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()。我希望在不创建新界面的情况下执行此操作(因此,无需隐式调用QueryInterfaceAddRef)。

void *test = pCalc;
COMLib::ICalcPtr pCalc2 = test;//'QueryInterface' : is not a member of 'System::Void'

仅供参考,我这样做的原因是该对象将作为void*类型从java传递到jni VC ++代码。我对任何关于该怎么做或在幕后发生什么的建议持开放态度。

1 个答案:

答案 0 :(得分:0)

同样地传递任何其他不适合指针或不易转换的不透明结构:通过传递其地址。

void* test = new COMLib::ICalcPtr(pCalc);

...

COMLib::ICalcPtr pCalc2 = *(COMLib::ICalcPtr*)test;
delete (COMLib::ICalcPtr*)test;

这会调用AddRefRelease,但不会调用QueryInterface