2009-07-16 6 views
0

Je veux obtenir un bon pointeur IDispatch, puis le cast à CMyDispatch pointeur et de faire mon chemin avec elle plus tard.Puis-je obtenir IDispatch correct de DISPPARAMS?

dire en javascript je veux faire quelque chose comme ceci:

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

x et y sont des instances de CMyDispatch.

CMyDispatch est retourné à javascript de cette façon:

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.Invoke() avec DISPATCH_PROPERTYPUT drapeau Je veux obtenir CMyDispatch instance qui détient y valeur.

Lorsque vous utilisez le code suivant, pDispatch est réglé sur des ordures:

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

Que dois-je faire pour obtenir le pointeur approprié CMyDispatch? Merci.

Répondre

1

Vous ne devriez vraiment pas, downcasting d'une interface à une implémentation concrète est la première étape sur la route de la perte. Cela dit, ce que vous faites devrait fonctionner, à moins que le javascript et l'objet COM s'exécutent dans différents appartements, et vous obtenez un proxy qui vous est passé, au lieu de l'objet réel.

Pourquoi avez-vous besoin de downcast?

+0

Je souhaite pouvoir définir la propriété ** external.obj.x ** sur l'objet ** y **, c'est-à-dire l'implémentation ** IDispatch **. –

+0

et pour ce faire, je dois obtenir une instance de mise en œuvre concrète, l'interface ne suffit pas, si je suis correct. –

+1

J'ai pu obtenir les propriétés nécessaires via ce proxy pDisp-> Invoke(). Ce n'est pas une réponse à la question, mais cela résout un problème qui a soulevé la question. Merci. –

Questions connexes