我可以从DISPPARAMS获得正确的IDispatch吗?

时间:2009-07-16 18:42:54

标签: c++ com idispatch

我想获得一个正确的 IDispatch 指针,然后将其强制转换为 CMyDispatch 指针并稍后使用它。

即。在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, 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_PROPERTYPUT 标记我想获得 CMyDispatch 实例,其中包含 y

使用以下代码时, 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;
}

我该怎么做才能获得正确的 CMyDispatch 指针? 谢谢。

1 个答案:

答案 0 :(得分:1)

你真的不应该,从一个接口转向一个具体的实现是走向灭亡之路的第一步。

那就是说,你正在做的事情应该有效,除非javascript和COM对象在不同的​​公寓中运行,并且你得到一个代理传递给你,而不是真实的对象。

你为什么需要垂头丧气?