Привет Мы используем IE9 в режиме несовместимости.
Мы делаем что-то вроде этого для чтения значений переменных JS со стороны браузера:
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();
Мы используем старую версию ATL.
Теперь эта процедура всегда дает сбой при запуске в режиме несовместимости IE9. «returnValue» равно Null, и мы получаем 0 для GetLastError.
Есть идеи? Это известная проблема, и если да, то какие исправления / обходные пути?
То, что вы делаете здесь, это запрос свойства с именем returnValue
из COM-объекта, для которого у вас есть IHTMLWindow2
указатель интерфейса Это не должно сработать, потому что вы предполагаете, что свойство существует, а в документации сказано иначе:
замечания
Это свойство применяется только для окон, созданных с помощью
IHTMLWindow2::showModalDialog
метод.
Более того, собственность принадлежит IHTMLDialog
интерфейс, так что вы могли бы получить доступ к нему напрямую, не полагаясь на CComDispatchDriver
Способность найти путь к нему через IDispatch
/IDispatchEx
доступ к именованным свойствам
Других решений пока нет …