做了一个钩子程序(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浏览器也不要卸载钩子和关闭共享内存。
我这里举例说是开了两个相同的页面,也可能开若干个相同的页面。
另外,不懂的,不能回答的,就别顶了,我会自己关注帖子,自己提前的,谢谢合作.
如果只有一个浏览器打开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浏览器也不要卸载钩子和关闭共享内存。
我这里举例说是开了两个相同的页面,也可能开若干个相同的页面。
另外,不懂的,不能回答的,就别顶了,我会自己关注帖子,自己提前的,谢谢合作.
解决方案 »
- EDBEngineError 没有获取数据库异常
- 用java的多线程实现:排队买票先到当有零钱时先买问题
- 重装系统就这样了!大家来看,有图! 只有13分了.
- double和real型有什么区别
- 与网络有关的API函数有哪些?系统中与网络有关的动态库有哪些?在线等待!
- 请问:在delphi中哪个控件能像qq那样把好友的图像分到一组显示,陌生人的又分为一组
- 赶了两年半的程序员,感觉很不爽!有同感的兄弟们进来
- 我想开发单机版的VOD系统,请大家关注
- Delphi中去尾空格的函数是什么?
- 大家来说说在你编程生涯中,你印象最深刻,使你受用最多的一本书!!!!
- 写了个简单 activeform ocx本机注册正常 其它电脑注册失败 ?
- delphi 菜鸟问题 / 号为会么不能用。
每打开一个浏览器就打开一个FileMapping(如果没有就创建)关闭一个浏览器会卸载一个钩子,不影响另外的使用
关闭一个浏览器就Close一个FileMapping的Handle,也不影响另外一个的使用
理论上是正确的 但是内存设置怎么设置 可能需要你在DLL里做判断的 不让就MAPPING到同一段地址会出错的
或者你枚举AB两个浏览器的进程,假如两个都不存在就卸掉钩子,如果当中有一个存在则重新挂钩,不知道你是不是设定了退出时自动脱钩……
lake的办法可能实行起来简单一点,内存方面就在DLL里面做判断,记得API HOOK防止重复挂钩写内存也是这么做的
CreateSemaphore
OpenSemaphore
ReleaseSemaphore
if MapHandle = 0 then
begin
MapHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
SizeOf(TShared), pchar('share_mem'));
end;
我的共享内存是这种方式创建的
但卸载钩子怎么保证最后一个关掉的浏览器页面卸载钩子,而先关闭的浏览器页面不卸载钩子呢?
也不能使用计数器原理,因为要考虑到浏览器异常崩溃的问题。