C++ 我可以从DISPPARAMS获得适当的IDispatch吗?

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

我想得到一个合适的IDispatch指针,然后将其投射到CMyDispatch指针,稍后再使用它

i、 e.在javascript中,我想做如下事情:

var x = external.obj.x;
var y = external.obj.y;
external.obj.x = y;
其中xyCMyDispatch的实例

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更新,向下播放可以很快中断-有很多原因使你看不到实际的实现,而只是一个代理。