JavaScriptに埋め込みIE11コントロールの外部オブジェクトを提供するためにIDocHostUIHandlerの実装を記述しました。 1つのクラスは、IUnknown、IDispatch、およびIDocHostUIHandlerの実装を提供します。 IDispatchインターフェイスは、外部オブジェクトとしてGetExternalに返されます。 GetExternal以外のIDocHostUIHandlerを呼び出すと、元のハンドラが呼び出されます。 JavaScriptでHideUIを呼び出した後にmshtmlがFAST_FAIL_INCORRECT_STACKで失敗します
HRESULT STDMETHODCALLTYPE mtQtWebBrowserDocHandler::GetExternal(IDispatch **ppDispatch)
{
qDebug("Calling GetExternal");
*ppDispatch = (IDispatch*)this;
return S_OK;
}
Iは、以下を実行する:
同じパターンがあるGetExternal除く他のすべてのメソッドのために使用されるHRESULT STDMETHODCALLTYPE mtQtWebBrowserDocHandler::HideUI(void)
{
qDebug("Calling HideUI");
if(m_defaultDocHostUIHandler)
{
HRESULT hr = m_defaultDocHostUIHandler->HideUI();
qDebug("Called HideUI");
return hr;
}
return E_NOTIMPL;
}
:
例えばHideUIは、以下のように実装されています
var r1 = window.external.Test1();
この結果、次のデバッグ出力の末尾になります。
'2016-10-10 11:09:19' DEBUG Calling GetHostInfo
'2016-10-10 11:09:19' DEBUG Called GetHostInfo
'2016-10-10 11:09:19' DEBUG mtQtWebBrowserDocHandler Release (ref now = 2)
'2016-10-10 11:09:19' DEBUG mtQtWebBrowserDocHandler AddRef (ref now = 3)
'2016-10-10 11:09:19' DEBUG Calling GetHostInfo
'2016-10-10 11:09:19' DEBUG Called GetHostInfo
'2016-10-10 11:09:19' DEBUG mtQtWebBrowserDocHandler Release (ref now = 2)
'2016-10-10 11:09:19' DEBUG Calling GetExternal
'2016-10-10 11:09:21' DEBUG mtQtWebBrowserDocHandler - IDispatch requested
'2016-10-10 11:09:21' DEBUG mtQtWebBrowserDocHandler AddRef (ref now = 3)
'2016-10-10 11:09:21' DEBUG mtQtWebBrowserDocHandler Release (ref now = 2)
'2016-10-10 11:09:21' DEBUG Calling ShowUI
'2016-10-10 11:09:21' DEBUG Called ShowUI
'2016-10-10 11:09:21' DEBUG Calling HideUI
'2016-10-10 11:09:21' DEBUG Called HideUI
最終的にHideUIから戻ると、ecx = FAST_FAIL_INCORRECT_STACKでINT 29hエラーが発生します。予想されるスタックは0x18D9C4であり、実際のスタックは0x18D9A4であり、0x20の不一致です。
私は完全に神秘的です。私のインターフェイスへの他の呼び出しは正しく動作し、私はHideUIの実装からE_NOTIMPLを返すだけで何の違いもありません。おそらく何がスタックのバランスを崩しているのでしょうか?
これは受け入れられた回答としてマークする必要があります。 –