C++ 我可以从DISPPARAMS获得适当的IDispatch吗?
我想得到一个合适的IDispatch指针,然后将其投射到CMyDispatch指针,稍后再使用它 i、 e.在javascript中,我想做如下事情:C++ 我可以从DISPPARAMS获得适当的IDispatch吗?,c++,com,idispatch,C++,Com,Idispatch,我想得到一个合适的IDispatch指针,然后将其投射到CMyDispatch指针,稍后再使用它 i、 e.在javascript中,我想做如下事情: var x = external.obj.x; var y = external.obj.y; external.obj.x = y; 其中x和y是CMyDispatch的实例 CMyDispatch通过以下方式返回到javascript: STDMETHODIMP CMyDispatch::Invoke(DISPID dispIdMember
var x = external.obj.x;
var y = external.obj.y;
external.obj.x = y;
其中x和y是CMyDispatch的实例
CMyDispatch通过以下方式返回到javascript:
STDMETHODIMP CMyDispatch::Invoke(DISPID dispIdMember, REFIID, LCID, WORD wFlags,
DISPPARAMS* pDispParams, VARIANT* pVarResult,
EXCEPINFO*, UINT*) {
if( pVarResult )
{
CMyDispatch* pDisp = new CMyDispatch();
CComVariant val( pDisp );
val.Detach( pVarResult );
}
return S_OK;
}
在CMyDispatch.Invoke()中,使用DISPATCH\u PROPERTYPUT标志,我想获取包含y值的CMyDispatch实例
使用以下代码时,pDispatch被设置为某些垃圾:
STDMETHODIMP CMyDispatch::Invoke(DISPID dispIdMember, REFIID, LCID, WORD wFlags,
DISPPARAMS* pDispParams, VARIANT* pVarResult,
EXCEPINFO*, UINT*) {
ASSERT( pDispParams->cArgs == 1 );
ASSERT( VT_DISPATCH == pDispParams->rgvarg[0].vt );
IDispatch* pDisp = ( pDispParams->rgvarg[0].pdispVal ); // <-- garbage
CMyDispatch* pDispatch = (CMyDispatch*) pDisp; // <-- garbage
return S_OK;
}
STDMETHODIMP CMyDispatch::Invoke(dispatid dispatchmember、refid、LCID、WORD wFlags、,
DISPPARAMS*pDispParams,变量*pVarResult,
例外情况*,单位*){
断言(pDispParams->cArgs==1);
断言(VT_DISPATCH==pDispParams->rgvarg[0].VT);
IDispatch*pDisp=(pDispParams->rgvarg[0].pdispVal);//你真的不应该这样做,从接口向下转换到具体实现是走向毁灭的第一步
这就是说,您所做的应该是可行的,除非javascript和COM对象在不同的单元中运行,并且您得到的是一个传递给您的代理,而不是真正的对象
为什么需要向下转换?我希望能够将external.obj.x属性设置为y对象,这就是IDispatch实现。要做到这一点,我必须获得具体的实现实例,接口是不够的,如果我是正确的。我能够通过这个代理pDisp->Invoke()获得所需的属性。这不是问题的答案,但解决了提出问题的一个问题。谢谢。这听起来是一个很好的、有效的解决方案。很高兴它成功了!通过简单的windows更新,向下播放可以很快中断-有很多原因使你看不到实际的实现,而只是一个代理。