源链接打不开,只要百度快照
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1557013
c
cheungmine
2007-4-8
——伎俩和技巧——
我们不需要自己创建脚本引擎,就可以使我们的程序能以最灵活的方式处理JS脚本。
我们经常遇到的情况是:从JavaScript脚本中调用C++对象,解决方法是把C++对象写成COM组件,然后在IE中使用这个组件,如下面的例子:
<HTML>
<HEAD>
<TITLE>MyCOM 控件测试页 - cheungmine@gmail.com</TITLE>
<script language="javascript">
<!--
function useMyCOM()
{
// 创建MyCOM控件, 它是一个地图
var obj = new ActiveXObject(“MyCOM.RootObj);
// 调用MyCOM.RootObj的方法loadInitFile
obj.loadInitFile(“c://cheungmine.ini”);
}
//-->
</script>
</HEAD>
<BODY>
……
</BODY>
</HTML>
可是,如果脱离了IE容器,如何使我们的脚本也能被MyCOM执行呢?换句话说:用户提交一段脚本,如何能被我们的程序动态执行呢?请看下面的代码:
// test.cpp
#include "stdafx.h"
#include <windows.h>
#include <atlbase.h>
#include <Mshtml.h> // 要求Platform SDK
// 使用 MyCOM 控件, 也可以直接使用 #import “../../MyCOM.dll” 语法
#include "../../MyCOM/MyCOM_i.c"
#include "../../MyCOM/MyCOM.h"
// cheungmine 2007-4-8
int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize(0);
{
// 创建HTML对象, 尽管我们不使用IE
CComPtr<IHTMLDocument> spHtmlDoc;
HRESULT hr = CoCreateInstance(CLSID_HTMLDocument, 0,
CLSCTX_ALL, IID_IHTMLDocument, (void**)&spHtmlDoc);
ATLASSERT(S_OK == hr);
// 取得Window对象
CComPtr<IDispatch> spDisp;
hr = spHtmlDoc->get_Script(&spDisp);
ATLASSERT(S_OK == hr);
CComQIPtr<IHTMLWindow2> spWindow;
spWindow = spDisp;
// 创建 MyCOM.RootObj 对象
CComPtr<IRootObj> spObj;
hr = ::CoCreateInstance(CLSID_RootObj, 0, CLSCTX_ALL, IID_IRootObj, (void**)& spObj);
ATLASSERT(S_OK == hr);
// 这里使用一个小技巧, 使我们的C++和JS可以共享spObj对象
hr = spWindow->put_opener(CComVariant(spObj)); // 除了opener,没有其它可用
ATLASSERT(S_OK == hr);
// 创建脚本, 这提供了一个灵活的机制
CComVariant vres;
CComBSTR js;
js += "var obj = window.opener; /
alert(obj); /
obj.loadInitFile(/"C:cheungmine.ini/");"; // 记住是4个
/*---上面的代码也可以这样写, 但是就无法与C++共享对象了---
js += "var obj = new ActiveXObject(/“MyCOM.RootObj/”); /
alert(obj); /
obj.loadInitFile(/"C:cheungmine.ini/");"; // 记住是4个
---------------------------------------------------------*/
// 执行脚本
hr = spWindow->execScript(js, CComBSTR("javascript"), &vres);
ATLASSERT(S_OK == hr);
}
::CoUninitialize();
return 0;
}
读到这里,我想聪明的读者可以发现使用这个技巧能给我们带来什么好处——我们不需要自己创建脚本引擎,就可以使我们的程序能以最灵活的方式处理JS脚本。这篇短文,除了给大家灵感,别的废话就不说了。
作者:cheungmine
绝对原创的真实作品!转载请注明出处。