2014-05-08 23 views
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()。优选地,我希望在不创建新界面的情况下执行此操作(因此,不会隐式地调用QueryInterfaceAddRef)。

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

通知你,我这样做的原因是,对象将是从Java里传递给JNI VC++代码为void*类型。我愿意接受任何关于该做什么或背后发生了什么的建议。

回答

0

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

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

...

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

这将导致调用AddRefRelease,但不QueryInterface

+0

不幸的是,没有奏效。在施放和取消引用过程中,我收到异常访问冲突(0xC0000005)。我能想到的最好的是'COMLib :: ICalcPtr pCalc2 = static_cast (test);'但是调用QueryInterface()。我的想法是,因为我已经创建了一个智能指针,为什么我必须创建另一个? – user845279

+0

我做错了什么,你的回答是正确的。然而,为了使用相同的智能指针,我做了'COMLib :: ICalcPtr * pCalc2 = static_cast (测试);'我不确定哪个更好,最佳实践或性能。 – user845279

+0

@ user845279:我做了一个新的,只是因为我不知道你的'pCalc'会保持多久。 –