通过c ++将脚本标记添加到Internet Explorer

时间:2016-05-03 00:38:16

标签: javascript c++ com

我有一个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-&gt; appendChild返回的HRESULT将以S_OK的形式返回;但是,没有任何内容被附加到页面。我该怎么做才能获得

<script id="myScript">
    function xyz(){
    //...
    }
</script>

到页面上?

修改

此方法添加的功能需要在网页中可执行。

3 个答案:

答案 0 :(得分:1)

对该主题进行了一些快速研究,发现this article使用IWebBrowser2作为构造函数的参数共享库。我认为这就足够了。

此外,您可以尝试使用浏览器帮助程序对象(即使不使用该接口,似乎更实用)。这里:link

祝你好运

答案 1 :(得分:0)

您可以navigate将网页转换为格式如下的字符串:

javascript:{ 
    // Your code here
}

javascript:(function(){ 
    // You can also use this if you want to load your script as a module
})()

这将立即运行javascript。不完全是你想要的,但是如果你想在dom中隐藏你的脚本,它会很有用

答案 2 :(得分:0)

您的主要目的是将您的javascript注入网页。因此,您实际上想要开发自定义IE扩展插件。我的建议是使用在IE中运行的Browser Helper Object方法并提供其他服务。可以使用ATLplain c++来实施。还有另一个简单的例子,如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"); 
} 

我认为这就是你想要的!