0
如何将COM接口指针转换为void指针并返回到COM指针?这里有一些代码来说明我的问题。这非常类似于此示例代码:_com_ptr_t assignment in VC++Cast _com_ptr_t void *然后返回_com_ptr_
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'
通知你,我这样做的原因是,对象将是从Java里传递给JNI VC++代码为void*
类型。我愿意接受任何关于该做什么或背后发生了什么的建议。
不幸的是,没有奏效。在施放和取消引用过程中,我收到异常访问冲突(0xC0000005)。我能想到的最好的是'COMLib :: ICalcPtr pCalc2 = static_cast(test);'但是调用QueryInterface()。我的想法是,因为我已经创建了一个智能指针,为什么我必须创建另一个? –
user845279
我做错了什么,你的回答是正确的。然而,为了使用相同的智能指针,我做了'COMLib :: ICalcPtr * pCalc2 = static_cast(测试);'我不确定哪个更好,最佳实践或性能。 –
user845279
@ user845279:我做了一个新的,只是因为我不知道你的'pCalc'会保持多久。 –