0

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

即在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;
}

在带有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指针?谢谢你。

4

1 回答 1

1

你真的不应该,从一个接口向下转换到一个具体的实现是通往厄运之路的第一步。

也就是说,你所做的应该可以工作,除非 javascript 和 COM 对象在不同的​​单元中运行,并且你得到一个传递给你的代理,而不是真实的对象。

为什么你需要沮丧?

于 2009-07-16T19:20:09.117 回答