Posso ottenere una corretta IDispatch da DISPPARAMS?
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.
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?