做了一个钩子程序(DLL)和一个ActiveX(OCX),ocx放在网页上(MyHook.html),OCX在加载的时候会启动钩子程序进行Hook,并写一个共享内存。而且还要调用Dll里的方法,页面关闭时,OCX会卸载钩子,停止Hook,同时也关闭之前创建的共享内存。
如果只有一个浏览器打开MyHook.html,那操作都是没问题的。
但是如果我开两个浏览器(A,B),都打开MyHook.html,那不就相当于钩子被加载两次了么,而且B浏览器关闭的时候会将钩子卸载和关闭共享内存,但A浏览器还要继续使用钩子功能和共享内存呢。我希望A浏览器打开MyHook.html时加载钩子,创建共享内存,B浏览器打开MyHook.html的时候,就不要再加载钩子了,也不要再创建共享内存了,但是却可以使用dll里的方法。
B浏览器关闭MyHook.html的时候,因为A浏览器还要使用钩子和dll里的方法和共享内存,所以B浏览器不要卸载钩子和关闭共享内存。
同样A浏览器关闭MyHook.html的时候,因为B浏览器还要使用钩子和dll里的方法和共享内存,所以A浏览器也不要卸载钩子和关闭共享内存。
我这里举例说是开了两个相同的页面,也可能开若干个相同的页面。
另外,不懂的,不能回答的,就别顶了,我会自己关注帖子,自己提前的,谢谢合作.

解决方案 »

  1.   

    每打开一个浏览器加载一次钩子
    每打开一个浏览器就打开一个FileMapping(如果没有就创建)关闭一个浏览器会卸载一个钩子,不影响另外的使用
    关闭一个浏览器就Close一个FileMapping的Handle,也不影响另外一个的使用
      

  2.   


    理论上是正确的 但是内存设置怎么设置 可能需要你在DLL里做判断的 不让就MAPPING到同一段地址会出错的
      

  3.   

    自己做一个互斥,申请一片内存空间进行定义?
    或者你枚举AB两个浏览器的进程,假如两个都不存在就卸掉钩子,如果当中有一个存在则重新挂钩,不知道你是不是设定了退出时自动脱钩……
    lake的办法可能实行起来简单一点,内存方面就在DLL里面做判断,记得API HOOK防止重复挂钩写内存也是这么做的
      

  4.   

    用计数器
    CreateSemaphore
    OpenSemaphore
    ReleaseSemaphore
      

  5.   

    你的共享区域是和 DLL 文件静态关联起来的吗?如果是的话,那就改成动态创建,这样可以检测多份副本的存在,自然解决了你的问题。
      

  6.   

      MapHandle := OpenFileMapping(FILE_MAP_WRITE, False, pchar('share_mem'));
      if MapHandle = 0 then
      begin
        MapHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
          SizeOf(TShared), pchar('share_mem'));
      end;
    我的共享内存是这种方式创建的
      

  7.   

    这种创建方式很好啊,可以满足你的需求了。你的第二个 OCX 加载时,如果发现 OpenFileMapping 成功,不就证明已经有钩子存在了吗,那就别再第二次加载钩子了。
      

  8.   

    判断钩子已经加载,可以通过OpenFileMapping也可以通过互斥来判断,就是说A浏览器页面加载钩子,而B浏览器页面不会重复加载钩子。
    但卸载钩子怎么保证最后一个关掉的浏览器页面卸载钩子,而先关闭的浏览器页面不卸载钩子呢?
      

  9.   

    加个进程判断,当没有MyHook.html执行时就释放
      

  10.   

    我只想通过我的activex进行处理。不要借助外部程序。不能判断myhook.html,因为完全有可能改成别的页面名称,或者将activex集成到其他页面上。
    也不能使用计数器原理,因为要考虑到浏览器异常崩溃的问题。