通过 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"); 
} 

我想这就是你想要的!