BHO HtmlEventObject 崩溃

发布于 2024-11-07 17:45:29 字数 1149 浏览 0 评论 0原文

我有一个用 C++ 编写的浏览器帮助程序对象,但在接收 OnHelp HtmlEvent 时遇到问题。

当我尝试访问属性时,浏览器崩溃。

VARIANT_BOOL STDMETHODCALLTYPE OnHelp(IHTMLEventObj2 *pEvtObj)
{
    std::cout << "OnHelp Event" << std::endl;

    if(pEvtObj != NULL) {
        VARIANT var;
        pEvtObj->getAttribute(L"formID", 0, &var);
        std::cout << (char*)var.bstrVal << std::endl;
    } 
    else {
        std::cout << "PELEM = NULL" << std::endl;
    }

    return VARIANT_TRUE;
}

由于某种原因它在 getAttribute 行崩溃?在 C# 中执行此操作时效果非常好。我希望有人能帮我解决这个问题。

编辑:

真正的问题是我需要使用 IHTMLEventObj 然后查询 IHTMLEventObj2 的参数。

VARIANT_BOOL STDMETHODCALLTYPE OnHelp(IHTMLEventObj *pEvtObj)
{
    IHTMLEventObj2 *pEvtObj2;
    pEvtObj->QueryInterface(IID_IHTMLEventObj2, (void**)&pEvtObj2);

    if(pEvtObj2 != NULL) {
        VARIANT var;
        pEvtObj2->getAttribute(CComBSTR(L"url"), 0, &var);
        std::cout << _bstr_t(var.bstrVal) << std::endl;
    } 
    else {
        std::cout << "PELEM = NULL" << std::endl;
    }

    return VARIANT_TRUE;
}

I have a browser helper object written in C++ but I have a problem when recieving a OnHelp HtmlEvent.

When I try to access a attribute the browser crashes.

VARIANT_BOOL STDMETHODCALLTYPE OnHelp(IHTMLEventObj2 *pEvtObj)
{
    std::cout << "OnHelp Event" << std::endl;

    if(pEvtObj != NULL) {
        VARIANT var;
        pEvtObj->getAttribute(L"formID", 0, &var);
        std::cout << (char*)var.bstrVal << std::endl;
    } 
    else {
        std::cout << "PELEM = NULL" << std::endl;
    }

    return VARIANT_TRUE;
}

It crashes on the getAttribute line for some reason? When doing this in C# it works perfectly. I hope somebody can help me fix this.

Edit:

The real problem was with the parameter I needed to use IHTMLEventObj and then query for IHTMLEventObj2.

VARIANT_BOOL STDMETHODCALLTYPE OnHelp(IHTMLEventObj *pEvtObj)
{
    IHTMLEventObj2 *pEvtObj2;
    pEvtObj->QueryInterface(IID_IHTMLEventObj2, (void**)&pEvtObj2);

    if(pEvtObj2 != NULL) {
        VARIANT var;
        pEvtObj2->getAttribute(CComBSTR(L"url"), 0, &var);
        std::cout << _bstr_t(var.bstrVal) << std::endl;
    } 
    else {
        std::cout << "PELEM = NULL" << std::endl;
    }

    return VARIANT_TRUE;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

那片花海 2024-11-14 17:45:29

getAttribute 的第一个参数是 BSTR,但您传递的 wchar_t*/unsigned int * 取决于 VC 编译设置。
BSTR 是一个系统字符串,预计将由接收方法释放。

尝试

#define DOM_ANON_STRING(x)          (_bstr_t(x))
pEvtObj->getAttribute(DOM_ANON_STRING(L"formID"), 0, &var);

The first arg for getAttribute is a BSTR, but your passing a wchar_t*/unsigned int * depending on VC compile settings.
BSTR is a system string which is expected to be deallocated by the receiving method.

Try

#define DOM_ANON_STRING(x)          (_bstr_t(x))
pEvtObj->getAttribute(DOM_ANON_STRING(L"formID"), 0, &var);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文