Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用IE插件浏览器辅助对象(BHO)访问iframe中的主体(至少一些数据)_Javascript_C++_Internet Explorer_Atl_Bho - Fatal编程技术网

Javascript 使用IE插件浏览器辅助对象(BHO)访问iframe中的主体(至少一些数据)

Javascript 使用IE插件浏览器辅助对象(BHO)访问iframe中的主体(至少一些数据),javascript,c++,internet-explorer,atl,bho,Javascript,C++,Internet Explorer,Atl,Bho,我正在开发一个IE8+BHO插件。现在,我只是尝试将文本插入另一个iframe(id=“canvas\u frame”)中包含的iframe(class=“Al-Ai-Editable”) 我设法获得了要添加文本的iframe的IHTMLElement(class=“Al-Ai-editable”)。我可以通过以下事实证明这一点:属于IHTMlement类型的el变量: el->get_className(&cl); //Al Ai editable 在MessageBox中正确

我正在开发一个IE8+BHO插件。现在,我只是尝试将文本插入另一个iframe(id=“canvas\u frame”)中包含的iframe(class=“Al-Ai-Editable”)

我设法获得了要添加文本的iframe的IHTMLElement(class=“Al-Ai-editable”)。我可以通过以下事实证明这一点:属于IHTMlement类型的el变量:

el->get_className(&cl); //Al Ai editable
在MessageBox中正确显示iframe的类

我现在的问题是,我无法访问相应iframe的主体元素

例如,当我尝试使用以下代码访问id为的iframe主体时,浏览器会崩溃:

el->getElementById(L":d6", &el); // ":d6" is the id of the body inside the iframe
此外,尝试获取内部HTML或内部文本时,我只需获取一个空字符串:

el->get_innerHTML(&htm);
MessageBox(hwnd, htm, L"BHO cl", MB_OK);

不显示任何内容(“”)

我甚至尝试了el->get_children方法,但也没有效果

下面是整个函数的一个示例:

void CgmailAdderBHO::checkIframes(HWND hwnd, IDispatch *lpDisp) {

USES_CONVERSION;

if (lpDisp) {
    IOleContainer* pContainer;

    // Get the container
    HRESULT hr = lpDisp->QueryInterface(IID_IOleContainer,
                                       (void**)&pContainer);
    lpDisp->Release();

    if (FAILED(hr)) {
      return;
    }

   IEnumUnknown* pEnumerator;

   // Get an enumerator for the frames
   hr = pContainer->EnumObjects(OLECONTF_EMBEDDINGS, &pEnumerator);
   pContainer->Release();

   if (FAILED(hr)) {
      return;
   }

   IUnknown* pUnk;
   ULONG uFetched;

   // Enumerate and refresh all the frames
   for (UINT i = 0; S_OK == pEnumerator->Next(1, &pUnk, &uFetched); i++)
   {
      IWebBrowser2* pBrowser;

      hr = pUnk->QueryInterface(IID_IWebBrowser2, (void**)&pBrowser);
      pUnk->Release();

     if (SUCCEEDED(hr))
     {
         // process the iframe
         CComPtr<IDispatch> docDisp;
        pBrowser->get_Document(&docDisp);
        CComQIPtr<IHTMLDocument3> doc = docDisp;
        CComQIPtr<IHTMLElementCollection> iframes;

        HRESULT hr = doc->getElementsByTagName(SysAllocString(L"body"), &iframes);
        long length;
        iframes->get_length(&length);
        CComVariant itemIndex(0);
        CComVariant empty;
        CComQIPtr<IDispatch> htmlEl;

        iframes->item(itemIndex, empty, &htmlEl);
        CComQIPtr<IHTMLElement> el = htmlEl;
        BSTR cl;
        BSTR cln(L"cP");
        el->get_className(&cl);

        if (cl && strcmp(OLE2A(cl), "cP") == 0) {
            //this is the canvas_frame
            // check if it has any other subframes
            BSTR html;
            el->get_innerHTML(&html);

            doc->getElementsByTagName(SysAllocString(L"iframe"), &iframes);
            if (iframes) {
                iframes->get_length(&length);
                if (length > 0) {
                    //MessageBox(hwnd, L"We are on compose!", L"BHO", MB_OK);
                    //add encrypt button code here
                    iframes->item(itemIndex, empty, &htmlEl);
                    el = htmlEl;
                    el->get_className(&cl); //Al Ai editable

                    BSTR htm;
                    el->get_innerHTML(&htm);
                    MessageBox(hwnd, cl, L"BHO cl", MB_OK);
                    MessageBox(hwnd, htm, L"BHO cl", MB_OK);

                    CComQIPtr<IHTMLDocument3> docul = htmlEl;

                    //docul->getElementById(L":d6", &el);

                    break; // found iframe ; now exit for
                }
            }
        }
        pBrowser->Release();
      }
   }
   pEnumerator->Release();
}
}
void cgmailadderbo::checkIframes(HWND-HWND,IDispatch*lpDisp){
使用_转换;
如果(lpDisp){
IOleContainer*pContainer;
//拿容器
HRESULT hr=lpDisp->QueryInterface(IID_IOleContainer,
(无效**)和P容器);
lpDisp->Release();
如果(失败(小时)){
返回;
}
IEnumUnknown*pEnumerator;
//获取帧的枚举数
hr=pContainer->EnumObjects(OLECTontf_嵌入和pEnumerator);
pContainer->Release();
如果(失败(小时)){
返回;
}
IUnknown*朋克;
ULONG uFetched;
//枚举并刷新所有帧
对于(UINT i=0;S_OK==pEnumerator->Next(1,&pUnk,&uFetched);i++)
{
IWebBrowser2*pBrowser;
hr=朋克->查询界面(IID_IWebBrowser2,(void**)和pBrowser);
朋克->释放();
如果(成功(hr))
{
//处理iframe
CComPtr docDisp;
pBrowser->get_文档(&docDisp);
CComQIPtr doc=docDisp;
CComQIPtr-iframes;
HRESULT hr=doc->getElementsByTagName(SysAllocString(L“body”),&iframes);
长度长;
iframes->get_length(&length);
c变异项索引(0);
c变量为空;
CComQIPtr-htmlEl;
iframes->item(itemIndex、empty和htmlEl);
CComQIPtr el=htmlEl;
BSTR-cl;
BSTR cln(L“cP”);
el->get_className(&cl);
如果(cl和strcmp(OLE2A(cl),“cP”)==0){
//这是画布框架
//检查是否有任何其他子帧
BSTR-html;
el->get_innerHTML(&html);
doc->getElementsByTagName(SysAllocString(L“iframe”),&iframes);
if(iframes){
iframes->get_length(&length);
如果(长度>0){
//消息框(hwnd,L“我们正在撰写!”,L“BHO”,MB_OK);
//在此处添加加密按钮代码
iframes->item(itemIndex、empty和htmlEl);
el=htmlEl;
el->get_className(&cl);//所有Ai可编辑
BSTR htm;
el->get_innerHTML(&htm);
消息框(hwnd,cl,L“BHO cl”,MB_OK);
消息框(hwnd,htm,L“BHO cl”,MB_OK);
CComQIPtr docul=htmlEl;
//文档->getElementById(L):d6“,&el);
break;//找到iframe;现在退出
}
}
}
pBrowser->Release();
}
}
pEnumerator->Release();
}
}

错误的原因是安全限制。您正在访问一个嵌套的iframe,因此需要重新配置函数以递归方式工作,从而绕过该限制

请参见如何使用访问第一级iFrame

hr=pContainer->EnumObjects(OLECTontf_嵌入和pEnumerator)

但随后使用

doc->getElementsByTagName(SysAllocString(L"iframe"), &iframes);'

要访问嵌套的iFrame?这就是错误所在,您需要使用EnumObjects访问与第一个相同的嵌套iFrame,然后获取IWebBrowser2接口。

这看起来可能会有所帮助。在示例代码中,您将SysAllocString作为函数参数传递。这将导致内存泄漏,因为对SysAllocString的每次调用都需要对SysFreeString进行相应的调用。因为您使用的是COM类,所以请使用CComBSTR类。
doc->getElementsByTagName(SysAllocString(L"iframe"), &iframes);'