Могу ли я получить правильный Idispatch от Distparams?

StackOverflow https://stackoverflow.com/questions/1139510

  •  16-09-2019
  •  | 
  •  

Вопрос

Я хочу получить должное Idispatch Указатель затем бросьте на это Cmydispatch Указатель и пройдите с этим позже.

т.е. в JavaScript я хочу сделать что -то вроде этого:

var x = external.obj.x;
var y = external.obj.y;
external.obj.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 экземпляр, который держится у ценность.

При использовании следующего кода, 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 указатель? Спасибо.

Это было полезно?

Решение

Вы действительно не должны, понижать от интерфейса до конкретной реализации, является первым шагом на дороге к Doom.

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

Зачем вам нужно понижать?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top