前段时间用MFC的ActiveX做了个控件嵌入到网页中,网页中也已经可以响应ActiveX的消息。但是现在出现了个问题
拿360浏览器来说吧:
我先打开htm调用了ocx,然后再次打开该htm调用同一个ocx时,此时发现有2个情况会出现:
由于360浏览器在页面被打开超过10个的时候就会重新创建一个进程,故如果:
1.再次打开的ocx和第一个在同一个进程,则初始化函数InitInstance()不会被重新调用,而是直接调用了控件类的构造函
  数CMyCtrl()
2.再次打开的ocx和第一个不在同一个进程,则初始化函数InitInstance()被重新调用,然后在调用控件类的构造函数这样就出现了个问题,我在打开第二个ID相同的ocx时,第一个OCX会触发一个事件InvockClose()给js调用,js检查到该事件触发,则调用window.close()关闭页面。
这样如果是第1种情况则没有问题,但是如果是第2种情况则不行,window.close()调用了没有效果,但是事件是肯定有触发的,因为我掉了一个ActiveX自定义的接口是有执行的。htm中关于关闭的代码如下:
<script for="ActiveXDemo" language="JavaScript" event="InvokeClose()">
function goHome()
{
    //测试事件:ActiveXDemo.Run("Test");    //关闭页面
    window.opener = "";
    window.open("","_self");
    window.close();
}程序部分代码如下:
// 激发关闭网页事件
void ActiveXDemo::FireInvokeClose()
{
     FireEvent(eventidInvokeClose, EVENT_PARAM(VTS_NONE));
} void ActiveXDemo::OnTimer(UINT_PTR nIDEvent)
{
   if (...)
   {
       FireInvokeClose();
   }
}

解决方案 »

  1.   

    不常发帖,以上是主要的源码,如果有啥需要补充的大家可以告知下
    ---------------------
    不知道是不是window.close()的调用问题?好像之前有看到过一个资料上面说是啥如果点击了打印预览后则在点击js页面上的关闭页面按钮则无效,是同样的问题吗?但是很奇怪的是如果在同一个进程中它又没有问题,而且我测试了下,在TheWorld浏览器中不管是不是在同一个进程都是没有问题的,都能正常关闭,到底360的浏览器有什么猫腻,忘牛逼人物告知下困扰很久的问题了
      

  2.   

    是的,我就是这么干的,关键不是在于事件通知,关键在于我事件调用后,js也调用了window.close(),但是页面就是关闭不了。不知道360浏览器5.0版本的升级修改了什么东西,导致我调用window.close关闭不了
    <script for="MyOCX" language="JavaScript" event="InvokeClose()">
    function goHome()
    {
      window.opener = "";
      window.open("","_self");
      window.close();
    }
    goHome()
    </script>如果是4.0版本的话,则可以关闭,具体情况是这样的,360浏览器打开第一个页面的时候任务管理器里面只有一个360se.exe进程,第二个则是另外开了个进程。
    我的代码是如果打开了同一个ocx则会触发消息(FireEvent(eventidInvokeClose, EVENT_PARAM(VTS_NONE));)通知js退出第一个,但是发现如果第二个是在另外一个进程打开的话则调用window.close()关闭不了页面。
    补充下:只有360浏览器5.0左右的版本才会这样,其他的好像不会,至少ie和世界之窗浏览器不会。具体的话大家可以弄个工程试试,或者方便的话留个邮箱我发下代码,代码很简单,都是向导新建的,只是增加了一个event给js调用
      

  3.   

    肯定是能的,我ocx可以运行的,ocx没有添加什么代码,就是一个mfc的ActiveX控件,就是多次调用的时候上诉情况会出现问题而且它360旧版本也是没有问题,就是不知道新版本的360更新了什么东西导致了这个问题。