【问题标题】:Can I get proper IDispatch from DISPPARAMS?我可以从 DISPARAMS 获得正确的 IDispatch 吗?
【发布时间】:2009-07-17 03:20:09
【问题描述】:

我想获得一个正确的 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 指针? 谢谢。

【问题讨论】:

    标签: c++ com idispatch


    【解决方案1】:

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

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

    你为什么需要沮丧?

    【讨论】:

    • 我希望能够将 external.obj.x 属性设置为 y 对象,即 IDispatch 实现.
    • 要做到这一点,我必须得到具体的实现实例,接口是不够的,如果我是正确的。
    • 我能够通过这个代理 pDisp->Invoke() 获得所需的属性。它不是对问题的回答,而是解决提出问题的问题。谢谢。
    • 这听起来像是一个很好的工作解决方案。很高兴它成功了!
    • 通过简单的 Windows 更新就可以快速中断向下转换 - 有很多原因导致您看不到实际的实现,而只是一个代理。
    猜你喜欢
    • 1970-01-01
    • 2021-01-20
    • 2011-10-31
    • 1970-01-01
    • 2021-01-08
    • 2011-03-24
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    相关资源
    最近更新 更多