¿Puedo obtener un IDispatch adecuado de DISPPARAMS?
Pregunta
quiero conseguir un adecuado Despacho de ID puntero y luego lanzarlo a CMyDispatch puntero y hacer lo que quiera más tarde.
es decir.en javascript quiero hacer algo como esto:
var x = external.obj.x;
var y = external.obj.y;
external.obj.x = y;
dónde X y y son ejemplos de CMyDispatch.
CMyDispatch se devuelve a javascript de esta manera:
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;
}
En CMyDispatch.Invocar() con DISPATCH_PROPERTYPUT bandera que quiero conseguir CMyDispatch instancia que sostiene y valor.
Al usar el siguiente código, pEnvío está configurado como algo de basura:
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;
}
¿Qué debo hacer para obtener la adecuada CMyDispatch ¿puntero?Gracias.
Solución
Realmente no deberías hacerlo, pasar de una interfaz a una implementación concreta es el primer paso en el camino hacia la perdición.
Dicho esto, lo que está haciendo debería funcionar, a menos que javascript y el objeto COM se ejecuten en diferentes apartamentos y se le pase un proxy, en lugar del objeto real.
¿Por qué necesitas abatirte?