我希望得到一个合适的的IDispatch 指针,然后将它转换为 CMyDispatch 指针和有我的方式使用它以后。

即。在JavaScript我想做的事情是这样的:

var x = external.obj.x;
var y = external.obj.y;
external.obj.x = y;

,其中<强> X 和<强>ý是的实例的 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 实例,其保持的ý

当使用下面的代码,的 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对象来看,你会得到一个代理传递给你,而不是真正的对象。

为什么你需要向下转型?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top