Fire-IE icon indicating copy to clipboard operation
Fire-IE copied to clipboard

TimwpDll.TimwpCheck控件致Firefox死锁

Open patwonder opened this issue 13 years ago • 11 comments

首先安装QQ最新版 测试链接:http://y.qq.com/vip/experience/ 切换到IE内核时Firefox死锁

删除Timwp插件后正常,但网页会提示错误信息。

由LongW报告

patwonder avatar Apr 14 '12 04:04 patwonder

测试了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>

yxl avatar Apr 14 '12 06:04 yxl

参考 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},也有此问题,添加相应键值后问题消失。

patwonder avatar Nov 16 '12 08:11 patwonder

建议的Workaound是找出所有可能导致假死的控件,分别添加ThreadingModel键值。

MSDN上关于该键值的说明: http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms682390%28v=vs.85%29.aspx

patwonder avatar Nov 16 '12 08:11 patwonder

由于权限问题,扩展不能直接改ThreadingModel。 我觉得应该联系腾讯解决。。

patwonder avatar Nov 16 '12 13:11 patwonder

让腾讯改可能比较难,另外扩展可以取得本地用户的所有权限,修改注册表应该是没问题的。

yxl avatar Nov 16 '12 15:11 yxl

HKEY_CURRENT_USER普通用户可以直接读写,HKEY_CLASSES_ROOT需要UAC提权才能改 = =||

patwonder avatar Nov 17 '12 06:11 patwonder

那就提权写,弹个UAC提示框影响也不太。

yxl avatar Nov 18 '12 16:11 yxl

总觉得挺麻烦,如果直接在Firefox进程里提权那么整个Firefox都是管理员权限了,不太安全。 最好是另外创建个进程做这事情。。

patwonder avatar Nov 18 '12 17:11 patwonder

发现打开OOPP就可以,不需要改写ThreadingModel。

patwonder avatar Nov 26 '12 15:11 patwonder

还是那句老话,除非必须,不启用OOPP :-) 用户愿意使用我们的扩展,很大程度是因为提供了Cookie同步、手势和ADB等功能。前2个功能,在OOPP启用后,性能降低,部分功能甚至无法使用。OOPP启用降低我们扩展的优势,另外由于额外开启OOPP进程,还增加了系统开销。OOPP唯一的好处是崩溃保护,但是我们的扩展现在已经稳定,很少崩溃,这个好处我们也没法享受到。

yxl avatar Nov 27 '12 03:11 yxl

Hook一下RegGetValue之类的函数不知是否可行,这样就不需要为每个控件都添加注册表项了。 Firefox现在的问题是main STA不在主线程上,而这个STA线程又不会去监听COM对象创建的消息(不知道Mozilla是怎么写的)。没有指定ThreadingModel的控件默认创建在main STA上,于是必定死锁。 从Firefox方面来说,只要在主线程一开始调用一下CoInitialize就可以确保main STA在主线程上,也就不会有这样的问题了。。

patwonder avatar May 21 '13 08:05 patwonder