需求:独立的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);