【问题标题】:How to Access Browser helper Object Method [duplicate]如何访问浏览器帮助对象方法[重复]
【发布时间】:2011-07-27 15:03:28
【问题描述】:

可能重复:
Call BHO from Javascript function

如何从 java 脚本中访问 BHO 的方法

【问题讨论】:

  • 你需要真的澄清你的问题。根据"How to Ask" guide,您需要比这更具体。

标签: visual-c++ c++-cli


【解决方案1】:

很久以前,我已经找到了解决同样问题的方法,但这只是 BHO 的一次实验,所以今天几乎不记得要做什么了。但是我可以给你这段代码作为进一步搜索的起点。

void CEventSink::Event_NavigateComplete(IDispatch *pDisp, LPOLESTR url)
{
    HRESULT hr;
    IDispatch *pTmpDisp;

    IWebBrowser2 *pFrame;
    hr = pDisp->QueryInterface(IID_IWebBrowser2, (void **)&pFrame);
    if (FAILED(hr) || !pFrame)
        return;

    hr = pFrame->get_Document(&pTmpDisp);
    if (FAILED(hr) || !pTmpDisp)
        return;

    IHTMLDocument2 *pDocument;
    hr = pTmpDisp->QueryInterface(IID_IHTMLDocument2, (void **)&pDocument);
    if (FAILED(hr) || !pDocument)
        return;

    IHTMLWindow2 *pWindow;
    pDocument->get_parentWindow(&pWindow);
    if (FAILED(hr) || !pWindow)
        return;

    IDispatchEx *pDispEx;
    hr = pWindow->QueryInterface(IID_IDispatchEx, (void **)&pDispEx);
    if (FAILED(hr) || !pDispEx)
        return;

    DISPID dispId;
    BSTR name = SysAllocString(_T("someMethod"));
    pDispEx->GetDispID(name, fdexNameEnsure, &dispId);
    SysFreeString(name);
    if (FAILED(hr) || dispId == DISPID_UNKNOWN)
        return;

    hr = this->QueryInterface(IID_IDispatch, (void **)&pTmpDisp);
    if (FAILED(hr) || !pTmpDisp)
        return;

    VARIANT v;
    VariantInit(&v);
    v.vt = VT_DISPATCH;
    v.pdispVal = pTmpDisp;

    DISPID ppid = DISPID_PROPERTYPUT;
    DISPPARAMS p;
    p.rgvarg = &v;
    p.cArgs = 1;
    p.rgdispidNamedArgs = &ppid;
    p.cNamedArgs = 1;

    hr = pDispEx->InvokeEx(dispId, LOCALE_USER_DEFAULT, 
                           DISPATCH_PROPERTYPUT, &p, NULL, NULL, NULL); 
}

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多