javascript - 使用VC++ COM从WebBrowser2获取IFrame的名称

标签 javascript visual-c++ com webbrowser-control

    VARIANT varindex,varresult;
    VariantInit(&varindex);
    VariantInit(&varresult);
    varindex.vt = VT_I4;
    varresult.vt = VT_DISPATCH;
    long lFrameNum = 0;
    CComPtr<IHTMLFramesCollection2> pFramesCollection;
    hr = m_spDoc->get_frames(&pFramesCollection); //CComPtr<IHTMLDocument2> m_spDoc
    if(FAILED(hr))
    {
        return false;
    }
    hr = pFramesCollection->get_length(&lFrameNum);
    if(FAILED(hr))
    {
        return false;
    }

    for(int i=0; i<lFrameNum; i++)
    { 
        varindex.lVal = i;
        if(pFramesCollection->item(&varindex, &varresult) == S_OK)
        {
            IDispatch *pDispatch;
            pDispatch = varresult.pdispVal;

            CComQIPtr< IHTMLFrameBase > spFrameBase(pDispatch);
            if(!spFrameBase)   return false; //failed here, E_NOINTERFACE
        }
    }

此处的代码展示了如何枚举网页中的框架并获取其名称。我成功获取每个 iframe 的 IDispatch,但是当我尝试获取 IHTMLFrameBase (IID_IHTMLFrameBase) 时,失败并出现错误 E_NOINTERFACE。

我不熟悉COM,我做错了什么?请帮助我,提前致谢。

最佳答案

虽然,我没有直接获取框架名称,但我想出了如何获取该特定框架的 IHTMLDocument2* 。然后,我可以对框架做一些事情,比如调用它的js函数等。代码如下:

        VARIANT varindex,varresult;
        VariantInit(&varindex);
        VariantInit(&varresult);
        varindex.vt = VT_BSTR;
        varindex.bstrVal = "Frame Name"; //the specific frame name
        pFramesCollection->item(&varindex,&varresult);
        IHTMLWindow2* pFrameWindow;
        varresult.pdispVal->QueryInterface(IID_IHTMLWindow2, (void **)&pFrameWindow);
        IHTMLDocument2* pDoc;
        pFrameWindow->get_document(&pDoc);
        //do something ...

关于javascript - 使用VC++ COM从WebBrowser2获取IFrame的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32347721/

相关文章:

javascript - 需要多长时间才会触发点击事件?

javascript - jQuery 在显示元素时做一些事情

c++ - 为什么我可以在 MSVC 和 icc 中为 glm::vec 创建用户定义的结构化绑定(bind),但不能在 Clang 和 GCC 中创建?

c++ - COM(C++) 编程教程?

c++ - 如何初始化一个常量 CLSID

javascript - 如何在 Webpack 中禁用捆绑以进行开发?

javascript - 如何在本地保存重新排序列表的新顺序? (Javascript/Jquery——不可排序插件)

java - `+++` 是否只是一个后缀增量,后跟一个中缀(总是)?

c++ - 使用 ReadDirectoryChangesW C++ 重命名文件夹后获取旧名称和新名称

c# - 如何处理与来自 .NET WPF 应用程序的具有 OCX 依赖项的 VB6 ActiveX dll 的对话