我编写了一个IDocHostUIHandler的实现,以便为JavaScript提供一个外部对象,一个嵌入式IE11控件。一个类提供IUnknown、IDispatch和IDocHostUIHandler的实现。IDispatch接口作为外部对象返回给GetExternal。对IDocHostUIHandler的所有调用,除了对原始处理程序的GetExternal调用之外。
例如,HideUI被实现为:
HRESULT STDMETHODCALLTYPE mtQtWebBrowserDocHandler::HideUI(void)
{
qDebug("Calling HideUI");
if(m_defaultDocHostUIHandler)
{
HRESULT hr = m_defaultDocHostUIHandler->HideUI();
qDebug("Called HideUI");
return hr;
}
return E_NOTIMPL;
}除了GetExternal之外,所有其他方法都使用相同的模式,即:
HRESULT STDMETHODCALLTYPE mtQtWebBrowserDocHandler::GetExternal(IDispatch **ppDispatch)
{
qDebug("Calling GetExternal");
*ppDispatch = (IDispatch*)this;
return S_OK;
}在JavaScript中,我执行以下操作:
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导致int29H错误。预期堆栈为0x18D9C4,实际堆栈为0x18D9A4,误差为0x20。
我完全迷茫了。对我的接口的其他调用工作正常,如果我只是从HideUI的实现中返回HideUI,这并没有什么区别。什么能使堆栈不平衡?
发布于 2016-10-10 12:05:44
在GetExternal函数中,您将返回一个接口指针,而不增加引用计数,这将导致以后引用计数不匹配。更好的执行办法是:
HRESULT STDMETHODCALLTYPE mtQtWebBrowserDocHandler::GetExternal(IDispatch **ppDispatch)
{
qDebug("Calling GetExternal");
*ppDispatch = (IDispatch*)this;
this->AddRef();
return S_OK;
}或者在那里使用QueryInterface。如果这是ATL,InternalQueryInterface。我怀疑这是导致错误的原因,因为您对对象的引用可能是由于更多的Release调用而被销毁的,而不是AddRef调用。
https://stackoverflow.com/questions/39956366
复制相似问题