0

こんにちは、非互換モードで 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 で、GetLastError の値は 0 です。

何か案は?これは既知の問題ですか? その場合、修正/回避策はありますか?

4

1 に答える 1

0

ここで行っているのは、インターフェイス ポインターreturnValueを持つ COM オブジェクトから名前が付けられたプロパティをクエリすることです。IHTMLWindow2プロパティが存在すると想定しているため、これはうまくいく必要はありません。ドキュメントにはそうではないと書かれています。

returnValue プロパティ:

備考

このプロパティは、メソッドを使用して作成されたウィンドウ にのみ適用されます。IHTMLWindow2::showModalDialog

さらに、プロパティはインターフェイスに属しているため、 /名前付きプロパティアクセスを介してプロパティへのパスを見つける の機能にIHTMLDialog依存せずに、直接アクセスできる可能性があります。CComDispatchDriverIDispatchIDispatchEx

于 2013-08-05T07:58:08.850 に答える