我有一个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>
到页面上?
修改
此方法添加的功能需要在网页中可执行。
答案 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方法并提供其他服务。可以使用ATL或plain 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");
}
我认为这就是你想要的!