本文代码基于上篇《ATL COM开发入门(一)(JS调用ActiveX/COM组件)》。
完成的需求:后台ATL代码回调前台js函数,后台ATL启动定时器完成前台计数。截图如下:
分析:完成此需求有两个难点,一是如何回调前台js代码?二是ATL是无窗口的如何使用定时器(MFC一般的定时器SetTimer、OnTimer都是CWnd的成员)?
MSDN提供了ATL直接获取前台IHTMLDocument2对象的方法,但是写得很不够详细,详见《获得ActiveX控件所在网页的对象模型》,不过笔者没有调试成功,有兴趣的读者可以深入研究下。这里笔者提供另外一种更加简便的方式:前台传入浏览器窗口对象的IDispatch指针(js中this便是),然后通过它就可以在ATL中任意获取网页元素,进行Invoke调用。
定时器采用Win32 API的SetTimer,在回调函数中回调前台js函数,显示计数。
一、ATLDemo.idl 中添加一个新的接口:
BeginTiming函数体:
TimerProc回调函数:
CallJSFunction:
二、前台代码:
拓展:
ATL中回调js函数并传参的例子,参见《ATL创建的ActiveX(COM组件)实现JS回调》。
源码点此下载,如有问题请点此</</</a>a>a>。