Domanda

Voglio ottenere una vera e propria IDispatch puntatore poi gettarlo ai CMyDispatch puntatore e avere la mia strada in un secondo momento.

vale a dire. in javascript che voglio fare qualcosa di simile:

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

dove x e y sono istanze di CMyDispatch .

CMyDispatch viene restituito a JavaScript in questo modo:

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

Nel CMyDispatch.Invoke () con DISPATCH_PROPERTYPUT la bandiera voglio ottenere CMyDispatch istanza che contiene y Valore .

Quando si utilizza il seguente codice, pDispatch è impostato in una certa spazzatura:

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

Che cosa devo fare per ottenere una corretta CMyDispatch puntatore? Grazie.

È stato utile?

Soluzione

È davvero non dovrebbe, downcasting da un'interfaccia ad una concreta attuazione è il primo passo sulla strada della rovina.

Detto questo, quello che stai facendo dovrebbe funzionare, a meno che il javascript e la corsa oggetto COM in diversi appartamenti, e si ottiene un proxy passato a voi, anziché l'oggetto vero e proprio.

Perché avete bisogno di downcast?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top