2013-08-05 1 views
0

Bonjour Nous utilisons IE9 en mode non-compatibilité.IE9 GetPropertyByName échouant

Nous faisons quelque chose comme ça pour lire les valeurs des variables JS du côté du navigateur:

ComPtr<IDispatch> disp; 
m_spBrowser->get_Document(&disp); 

CComQIPtr<IHTMLDocument2> htmlDoc = disp; 
if(!htmlDoc) return ZString(); 

CComPtr<IHTMLWindow2> spWindow; 
htmlDoc->get_parentWindow(&spWindow); 

CComVariant varRes; 
CComDispatchDriver dispWindow = spWindow; 
if(dispWindow) { 
    HRESULT hr = dispWindow.GetPropertyByName(L"returnValue", &varRes); 
    if(SUCCEEDED(hr) && SUCCEEDED(varRes.ChangeType(VT_BSTR))) 
     return CString(varRes.bstrVal); 
} 
return CString(); 

Nous utilisons ancienne version d'ATL.

Maintenant, cette routine échoue toujours lorsqu'elle est exécutée en mode non-compatibilité IE9. "returnValue" est Null et nous obtenons la valeur 0 pour GetLastError.

Des idées? Est-ce un problème connu et si oui des correctifs/solutions de contournement?

+0

Nous prévoyons obtenir window.top.returnValue et accéder aux variables JS du côté C++. Nous utilisons MSVC 6 ATL si cela aide. – Pranab

+0

Cochez [this] (http://stackoverflow.com/questions/18342200/how-do-i-call-eval-in-ie-from-c/18349546#18349546) pour un exemple de 'IDispatchEx :: GetDispID' sur l'objet 'window'. – Noseratio

Répondre

0

Ce que vous faites ici est l'interrogation de la propriété returnValue à partir de l'objet COM, pour lequel vous avez le pointeur d'interface IHTMLWindow2. Cela ne doit pas travailler parce que vous assumez la propriété existe et la documentation dit autrement:

returnValue property:

Remarques

Cette propriété s'applique uniquement aux fenêtres créées en utilisant le IHTMLWindow2::showModalDialog méthode.

Plus que, la propriété appartient à l'interface IHTMLDialog, pour que vous puissiez accéder peut-être directement sans compter sur les capacités de CComDispatchDriver trouver chemin d'accès via IDispatch/IDispatchEx accès à la propriété du nom.

+0

Nous avons défini la valeur de l'objet JS comme window.top.returnValue = . Selon votre logique, le code aurait échoué pour tous les navigateurs .. pas seulement IE9. Aussi, pourquoi devrais-je obtenir la valeur d'erreur comme 0 (action accomplie avec succès)? – Pranab

+0

'1' ma logique est que vous pourriez obtenir la propriété plus précisément au lieu de s'attendre à être trouvé via name lookup' 2' 'GetLastError' ne devrait pas vous donner de code d'erreur ici, à la place vous devez entrer dans la fonction et vérifiez les choses là-bas. 'hr' pourrait avoir un code d'erreur connexe. –

+0

Une idée de comment je peux obtenir l'objet IHTMLDialog dans le code/la fonction ci-dessus? Je crée la boîte de dialogue modale à partir d'où et j'ai juste besoin de lire la propriété returnValue de la fonction ci-dessus. Aussi peut-il être une limitation de ATL 3.0 parce que tous les autres navigateurs/plates-formes fonctionnent bien. – Pranab