JavaScript에 내장 된 IE11 컨트롤에 외부 개체를 제공하기 위해 IDocHostUIHandler 구현을 작성했습니다. 하나의 클래스는 IUnknown, IDispatch 및 IDocHostUIHandler의 구현을 제공합니다. IDispatch 인터페이스는 외부 개체로 GetExternal에 반환됩니다. 원래 처리기로 GetExternal 호출을 제외한 IDocHostUIHandler에 대한 모든 호출. HideUI 같이 구현 예HideUI를 호출 한 후 mshtml이 FAST_FAIL_INCORRECT_STACK과 함께 실패합니다.
:
동일한 패턴이다 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;
}
: 자바 스크립트
HRESULT STDMETHODCALLTYPE mtQtWebBrowserDocHandler::GetExternal(IDispatch **ppDispatch)
{
qDebug("Calling GetExternal");
*ppDispatch = (IDispatch*)this;
return S_OK;
}
난 다음 실행 :
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을 반환하면 아무런 차이가 없습니다. 아마도 스택의 불균형이 될 수 있습니까?
이것을 허용 된 대답으로 표시해야합니다. –