gpt4 book ai didi

javascript - 使用 IE 插件浏览器帮助对象 (BHO) 在 iframe 中访问正文(至少一些数据)

转载 作者:行者123 更新时间:2023-11-28 08:23:03 25 4
gpt4 key购买 nike

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

我设法获得了我要向其添加文本的 iframe 的 IHTMLElement(class="Al Ai editable")。我可以通过 IHTMLElement 类型的 el 变量来证明这一点:

el->get_className(&cl); //Al Ai editable

在 MessageBox 中正确显示 iframe 的类。

我现在遇到的问题是我无法访问相应 iframe 的body 元素

例如,当我尝试使用以下代码访问带有 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_innerText(&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();
}
}

最佳答案

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

查看如何使用

访问第一级 iframe

hr = pContainer->EnumObjects(OLECONTF_EMBEDDINGS, &pEnumerator);

然后使用

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

访问嵌套的 iframe ?这就是错误,您需要像第一个一样访问嵌套的 iframe,使用 EnumObjects 然后获取 IWebBrowser2 接口(interface)。

关于javascript - 使用 IE 插件浏览器帮助对象 (BHO) 在 iframe 中访问正文(至少一些数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5119581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com