我想获得一个正确的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;
}


在带有DISPATCH_PROPERTYPUT标志的CMyDispatch.Invoke()中,我想获取包含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;
}


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

最佳答案

您真的不应该,从接口向下转换到具体的实现是走向毁灭之路的第一步。

就是说,除非JavaScript和COM对象在不同的​​单元中运行,并且您将传递给您的代理而不是真实的对象,否则您的工作应该可以正常工作。

为什么需要垂头丧气?

10-04 14:54