TimwpDll.TimwpCheck控件致Firefox死锁
首先安装QQ最新版 测试链接:http://y.qq.com/vip/experience/ 切换到IE内核时Firefox死锁
删除Timwp插件后正常,但网页会提示错误信息。
由LongW报告
测试了IE Tab2也有这个问题。
这个ActiveX控件是用来检测QQ是否安装的。
提供一个测试文件。
testQQ.html
<html>
<body>
<script>
try
{
var cpTimwp= new ActiveXObject("TimwpDll.TimwpCheck");
alert(cpTimwp);
}
catch(e)
{
alert("您没有安装QQ/TM,或者您的版本过旧,请下载 ");
}
</script>
</body>
</html>
参考 http://blogs.msdn.com/b/asiatech/archive/2009/03/10/identify-deadlock-through-the-hwnd-handler.aspx 可能是腾讯某些控件没有设置合适的ThreadingModel引起。 添加以下注册表键值后,可以通过testQQ.html测试:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{ED4CA2E5-0EEA-44C1-AD7E-74A07A7507A4}\InProcServer32]
"ThreadingModel"="Apartment"
Q宠大乐斗的QQCPHelper.CPAdder控件,CLSID为{23752AA7-CAD7-40C2-99EE-7A9CD3C20C6D},也有此问题,添加相应键值后问题消失。
建议的Workaound是找出所有可能导致假死的控件,分别添加ThreadingModel键值。
MSDN上关于该键值的说明: http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms682390%28v=vs.85%29.aspx
由于权限问题,扩展不能直接改ThreadingModel。 我觉得应该联系腾讯解决。。
让腾讯改可能比较难,另外扩展可以取得本地用户的所有权限,修改注册表应该是没问题的。
HKEY_CURRENT_USER普通用户可以直接读写,HKEY_CLASSES_ROOT需要UAC提权才能改 = =||
那就提权写,弹个UAC提示框影响也不太。
总觉得挺麻烦,如果直接在Firefox进程里提权那么整个Firefox都是管理员权限了,不太安全。 最好是另外创建个进程做这事情。。
发现打开OOPP就可以,不需要改写ThreadingModel。
还是那句老话,除非必须,不启用OOPP :-) 用户愿意使用我们的扩展,很大程度是因为提供了Cookie同步、手势和ADB等功能。前2个功能,在OOPP启用后,性能降低,部分功能甚至无法使用。OOPP启用降低我们扩展的优势,另外由于额外开启OOPP进程,还增加了系统开销。OOPP唯一的好处是崩溃保护,但是我们的扩展现在已经稳定,很少崩溃,这个好处我们也没法享受到。
Hook一下RegGetValue之类的函数不知是否可行,这样就不需要为每个控件都添加注册表项了。 Firefox现在的问题是main STA不在主线程上,而这个STA线程又不会去监听COM对象创建的消息(不知道Mozilla是怎么写的)。没有指定ThreadingModel的控件默认创建在main STA上,于是必定死锁。 从Firefox方面来说,只要在主线程一开始调用一下CoInitialize就可以确保main STA在主线程上,也就不会有这样的问题了。。