Могу ли я получить правильный IDispatch от DISPPARAMS? - PullRequest
0 голосов
/ 16 июля 2009

Я хочу получить правильный указатель 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 Ответ

1 голос
/ 16 июля 2009

Вы действительно не должны этого делать, переход от интерфейса к конкретной реализации - это первый шаг на пути к гибели.

Тем не менее, то, что вы делаете, должно работать, если только javascript и COM-объект не работают в разных квартирах, и вы не получите прокси вместо реального объекта.

Зачем тебе удручать?

...