通过 C++ 向 Internet Explorer 添加脚本标签
Add a script tag to internet explorer through c++
我有一个 COM 客户端可执行文件,它生成一个新的 IE 进程并获取对 IWebBrowser2 接口的引用,我想在 IE 加载的网页中注入一个 JavaScript 标记。
目前我正在做的是:
void Document::AddScript(const std::wstring script, const std::wstring id) {
HRESULT hr = S_OK;
IHTMLElement* pHtmlElem;
CComVariant vJavascript = "text/javascript";
CComBSTR vScriptContents = script.c_str();
CComBSTR vId = id.c_str();
hr = _pDocument2->createElement(_T("script"), &pHtmlElem);
if (SUCCEEDED(hr) && pHtmlElem != NULL)
{
hr = pHtmlElem->setAttribute(_T("type"), vJavascript);
hr = pHtmlElem->put_innerText(vScriptContents);
hr = pHtmlElem->put_id(vId);
}
CComPtr<IHTMLElement> body;
hr = pDocument->get_body(&body);
CComQIPtr<IHTMLDOMNode, &IID_IHTMLDOMNode> spBodyNode = body;
CComQIPtr<IHTMLDOMNode, &IID_IHTMLDOMNode> spNodeNew;
hr = pHtmlElem->QueryInterface(&spNodeNew);
CComPtr<IHTMLDOMNode> node;
if (spBodyNode)
{
hr = spBodyNode->appendChild(spNodeNew, &node);
}
}
从 spBodyNode->appendChild 返回的 HRESULT 返回为 S_OK;但是,页面上没有附加任何内容。我该怎么做才能得到
<script id="myScript">
function xyz(){
//...
}
</script>
进入页面?
编辑
该方法添加的功能需要在网页中可执行
对该主题进行了一些快速研究,发现 this article 共享一个使用 IWebBrowser2 作为构造函数参数的库。我觉得够了。
此外,您可以尝试使用浏览器帮助对象(即使不使用该界面也似乎更实用)。这里:link
祝你好运
您可以 navigate 将网页转换为格式如下的字符串:
javascript:{
// Your code here
}
javascript:(function(){
// You can also use this if you want to load your script as a module
})()
这将立即 运行 javascript。不完全是你想要的,但它很有用,特别是如果你想在 dom
中隐藏你的脚本
您的主要目的是将您的 javascript 注入网页。所以,你其实是想开发一个自定义的IE扩展插件。我的建议是使用 Browser Helper Object method which runs within IE and offers additional services. Implementation is possible with ATL or with plain c++. There is also another simple example like How to inject javascript code into WebBrowser in Windows Forms applications
示例:
System::Void MyForm::webBrowser1_DocumentCompleted(System::Object^ sender, System::Windows::Forms::WebBrowserDocumentCompletedEventArgs^ e)
{
HtmlElement^ headElement = webBrowser1->Document->GetElementsByTagName("head")[0];
HtmlElement^ scriptElement = webBrowser1->Document->CreateElement("script");
IHTMLScriptElement^ element = (IHTMLScriptElement^)scriptElement->DomElement;
element->text = "function sayHello() { alert('hello') }";
headElement->AppendChild(scriptElement);
webBrowser1->Document->InvokeScript("sayHello");
}
我想这就是你想要的!
我有一个 COM 客户端可执行文件,它生成一个新的 IE 进程并获取对 IWebBrowser2 接口的引用,我想在 IE 加载的网页中注入一个 JavaScript 标记。
目前我正在做的是:
void Document::AddScript(const std::wstring script, const std::wstring id) {
HRESULT hr = S_OK;
IHTMLElement* pHtmlElem;
CComVariant vJavascript = "text/javascript";
CComBSTR vScriptContents = script.c_str();
CComBSTR vId = id.c_str();
hr = _pDocument2->createElement(_T("script"), &pHtmlElem);
if (SUCCEEDED(hr) && pHtmlElem != NULL)
{
hr = pHtmlElem->setAttribute(_T("type"), vJavascript);
hr = pHtmlElem->put_innerText(vScriptContents);
hr = pHtmlElem->put_id(vId);
}
CComPtr<IHTMLElement> body;
hr = pDocument->get_body(&body);
CComQIPtr<IHTMLDOMNode, &IID_IHTMLDOMNode> spBodyNode = body;
CComQIPtr<IHTMLDOMNode, &IID_IHTMLDOMNode> spNodeNew;
hr = pHtmlElem->QueryInterface(&spNodeNew);
CComPtr<IHTMLDOMNode> node;
if (spBodyNode)
{
hr = spBodyNode->appendChild(spNodeNew, &node);
}
}
从 spBodyNode->appendChild 返回的 HRESULT 返回为 S_OK;但是,页面上没有附加任何内容。我该怎么做才能得到
<script id="myScript">
function xyz(){
//...
}
</script>
进入页面?
编辑
该方法添加的功能需要在网页中可执行
对该主题进行了一些快速研究,发现 this article 共享一个使用 IWebBrowser2 作为构造函数参数的库。我觉得够了。
此外,您可以尝试使用浏览器帮助对象(即使不使用该界面也似乎更实用)。这里:link
祝你好运
您可以 navigate 将网页转换为格式如下的字符串:
javascript:{
// Your code here
}
javascript:(function(){
// You can also use this if you want to load your script as a module
})()
这将立即 运行 javascript。不完全是你想要的,但它很有用,特别是如果你想在 dom
中隐藏你的脚本您的主要目的是将您的 javascript 注入网页。所以,你其实是想开发一个自定义的IE扩展插件。我的建议是使用 Browser Helper Object method which runs within IE and offers additional services. Implementation is possible with ATL or with plain c++. There is also another simple example like How to inject javascript code into WebBrowser in Windows Forms applications
示例:
System::Void MyForm::webBrowser1_DocumentCompleted(System::Object^ sender, System::Windows::Forms::WebBrowserDocumentCompletedEventArgs^ e)
{
HtmlElement^ headElement = webBrowser1->Document->GetElementsByTagName("head")[0];
HtmlElement^ scriptElement = webBrowser1->Document->CreateElement("script");
IHTMLScriptElement^ element = (IHTMLScriptElement^)scriptElement->DomElement;
element->text = "function sayHello() { alert('hello') }";
headElement->AppendChild(scriptElement);
webBrowser1->Document->InvokeScript("sayHello");
}
我想这就是你想要的!