首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用FAST_FAIL_INCORRECT_STACK后mshtml在HideUI中失败

调用FAST_FAIL_INCORRECT_STACK后mshtml在HideUI中失败
EN

Stack Overflow用户
提问于 2016-10-10 10:38:03
回答 1查看 206关注 0票数 1

我编写了一个IDocHostUIHandler的实现,以便为JavaScript提供一个外部对象,一个嵌入式IE11控件。一个类提供IUnknown、IDispatch和IDocHostUIHandler的实现。IDispatch接口作为外部对象返回给GetExternal。对IDocHostUIHandler的所有调用,除了对原始处理程序的GetExternal调用之外。

例如,HideUI被实现为:

代码语言:javascript
复制
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之外,所有其他方法都使用相同的模式,即:

代码语言:javascript
复制
HRESULT STDMETHODCALLTYPE mtQtWebBrowserDocHandler::GetExternal(IDispatch **ppDispatch)
{
    qDebug("Calling GetExternal");
    *ppDispatch = (IDispatch*)this;
    return S_OK;
}

在JavaScript中,我执行以下操作:

代码语言:javascript
复制
var r1 = window.external.Test1();

这将导致以下调试输出尾:

代码语言:javascript
复制
'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,这并没有什么区别。什么能使堆栈不平衡?

EN

回答 1

Stack Overflow用户

发布于 2016-10-10 12:05:44

GetExternal函数中,您将返回一个接口指针,而不增加引用计数,这将导致以后引用计数不匹配。更好的执行办法是:

代码语言:javascript
复制
HRESULT STDMETHODCALLTYPE mtQtWebBrowserDocHandler::GetExternal(IDispatch **ppDispatch)
{
    qDebug("Calling GetExternal");
    *ppDispatch = (IDispatch*)this;
    this->AddRef();
    return S_OK;
}

或者在那里使用QueryInterface。如果这是ATL,InternalQueryInterface。我怀疑这是导致错误的原因,因为您对对象的引用可能是由于更多的Release调用而被销毁的,而不是AddRef调用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39956366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档