现在的位置: 首页 > 综合 > 正文

ActiveX中访问script(IE中,非WebBrowser2)

2014年02月02日 ⁄ 综合 ⁄ 共 1003字 ⁄ 字号 评论关闭

需求:独立的OA系统(基于B/S)和IM(使用2个不同的数据库SQL和Access),要求OA和IM的用户能够互相通信。建立2个数据库用户表间的map,和2个外挂程序(1个运行于服务器端(S)(OA和IM使用同一服务器),一个是ActiveX,在OA的Web页(A)),S负责同时和A与IMServer通讯,传递消息(需要IMServer的支持),A负责Web和S的通信,把S传递的消息主动显示到Web中,同时,将Web的动作发往S;S收到该动作,将之传给IMServer,通过IMServer将OA用户的动作发送给IM的用户(群),反之也然。OA-》IM,需要script访问ActiveX;IM-》OA需要ActiveX访问script。

解决:web客户端的window对象是一个IHTMLWindow2指针。如果把window直接传递给ActiveX,然后希望通过IHTMLWindow2的execScript来执行script,这不会成功。ActiveX可以存储window,该window在script中的效果也和原window对象一样,但就是无法在ActiveX中执行任何操作,这是因为ActiveX拥有一个独立的进程,而传入的window却是属于另外一个进程。那么,为什么script能够访问ActiveX呢?因为com规范。

示例:

在ActiveXCtrl类中添加变量:IHTMLWindow2* pWindow;
 IHTMLDocument2*pDocument;在使用前执行如下语句:LPOLECLIENTSITE oleClientSite=GetClientSite();
 CComPtr < IOleContainer > spContainer;
 oleClientSite->GetContainer( &spContainer );
 CComQIPtr < IHTMLDocument2 > spDoc = spContainer;
 if ( spDoc )//已经得到了 IHTMLDocument2 的接口指针
 {
  pDocument=spDoc;
  spDoc->get_parentWindow(&pWindow);
 }

使用时:

VARIANT v;
 HRESULT hr=pWindow->execScript(CComBSTR("script语句"),CComBSTR("javascript"),&v);

抱歉!评论已关闭.