Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何更改我的IE扩展以解决另一个模块(flash.ocx)崩溃IE中的访问冲突?_.net_Internet Explorer_Flash_Bho_Ieaddon - Fatal编程技术网

.net 如何更改我的IE扩展以解决另一个模块(flash.ocx)崩溃IE中的访问冲突?

.net 如何更改我的IE扩展以解决另一个模块(flash.ocx)崩溃IE中的访问冲突?,.net,internet-explorer,flash,bho,ieaddon,.net,Internet Explorer,Flash,Bho,Ieaddon,我有一个Internet Explorer扩展(BHO),可以在数千台机器上正常工作,但在某些情况下,它似乎会导致Flash因访问冲突而使iexplore.exe崩溃。我可以尝试做些什么来避免这种冲突 更多详细信息: 在一个客户的环境中,我们遇到这样一种情况:当使用Flash访问网站并关闭IE选项卡后,选项卡进程崩溃。只有当Flash和my extension都已启用且目前为止无法在该公司环境之外的工作站上复制时,才会发生这种情况。如果我的扩展被配置为在该页面上不执行任何操作,也就是说,我的一些

我有一个Internet Explorer扩展(BHO),可以在数千台机器上正常工作,但在某些情况下,它似乎会导致Flash因访问冲突而使iexplore.exe崩溃。我可以尝试做些什么来避免这种冲突

更多详细信息:

在一个客户的环境中,我们遇到这样一种情况:当使用Flash访问网站并关闭IE选项卡后,选项卡进程崩溃。只有当Flash和my extension都已启用且目前为止无法在该公司环境之外的工作站上复制时,才会发生这种情况。如果我的扩展被配置为在该页面上不执行任何操作,也就是说,我的一些代码仍然执行,但执行的很少

如果网站不在受信任的网站中,则该选项卡将以保护模式运行,崩溃的结果是出现一个窗口,表明该网页希望运行dw20.exe(即Dr Watson)

如果将网站添加到受信任的站点,则会在windows应用程序事件日志中写入一个错误,IE会重新打开该选项卡,并显示一条小信息栏消息,说明IE已从崩溃中恢复。不管怎样,这都令人沮丧!用户真的不在乎当他们关闭选项卡时进程是否崩溃,因此我很乐意找到一种解决方法,即不会向用户显示错误消息,并且选项卡不会重新打开

windows应用程序事件日志没有说明太多,但它确实说明iexplore.exe进程因出现故障的模块闪存而崩溃:

Error / Application Error / EventID=1000

Faulting application name: iexplore.exe, version 9.0.8112.16592, time stamp 0x544e95a7
Faulting module name: Flash32_13_0_0_214.ocx, version 13.0.0.214, time stamp 0x5359c422
Exception code: 0xc0000005
Fault offset: 0x00073678
Faulting application start time: 0x01d0099db319df49
Faulting application path: C:\Program Files\Internet Explorer\iexplore.exe
Faulting module path: C:\Windows\system32\Macromed\Flash\Flash32_13_0_0_214.ocx
ReportId: 0094988b-7591-11e4-93e6-6cf0492a8610
这是一个相当新的flash版本,但不是最新版本。他们尝试升级到最新版本,但症状相同

他们的工作站运行Sophos antivirus,在一些罕见的情况下,我们看到antivirus会导致扩展出现问题。我们在停止所有提到Sophos的windows服务后进行了测试,同样的问题也发生了,所以我很确定这与Sophos无关

我的扩展是使用.NET3.5SP1构建的,这不是一种理想的方法,因为它可能与其他扩展在运行时发生冲突,但目前情况就是这样

如果我禁用扩展,问题就会消失。如果我禁用闪光灯,问题就会消失。故障模块
Flash32_13_0_0_214.ocx
强烈指出这是一个bug,但我认为理论上这可能是我代码中的一个问题。我的扩展没有执行任何非托管代码,所以它不可能是这样的,所以我想不出我的扩展可以做任何可能导致访问冲突的事情。这使得Flash中可能存在bug,这似乎完全有可能,或者我与IE中COM对象的交互方式存在问题。但是,除非我能指出一些具体的、可复制的东西,否则Flash团队不太可能调查此类bug报告,现在我不能在任何开发机器上进行复制,所以这不是很好。即使它是一个Flash bug,从客户的角度来看,这与我的产品中的bug没有什么不同:要么我修复它,要么我的产品将被卸载,他们将保持Flash

选项

我所希望的是关于以下方面的一些想法:

  • 在我的代码/产品中有什么可以避免与Flash冲突的地方吗?例如,将我的DLL重定基址以将扩展移到另一个内存区域是否有任何希望?为.NET4.0/4.5重新编译是否有机会工作

  • 我能做些什么来复制这个问题。。。为什么这在其他几十家公司都不是问题,但在这家公司却成了问题?有没有想过是什么环境因素触发了这里的问题,而不是在设置不同的工作站上

  • 尝试获取崩溃转储或其他关于崩溃的诊断信息(例如崩溃时的ProcMon)是否有意义?我不具备进行此类诊断的专业知识,因此我希望避免此类诊断,除非它可能会让我找到一个答案,说明我可以在我的产品中做哪些不同的事情,或者准确指出闪存模块中的某个错误(如果真的有)

  • 我很高兴能找到一种方法让它安静地崩溃,比如说,当它崩溃时,能阻止IE重新打开标签

我可能需要一段时间才能与客户一起测试不同的选项,所以我想尝试一些东西。非常感谢您的任何想法

到目前为止,我有一些随机的想法。其中有值得一试的吗

  • 使用.NET4重新编译
  • 在我的SetSite(null)方法(卸载扩展时发生的事件)中,我有几行清理代码,比如
    Marshal.FinalReleaseComObject(webBrowser)
    GC.Collect()
    。删除其中一个或多个:可能GC或COM清理会弄乱闪存的内存空间
  • 重新设置DLL的基址
  • 在工作站上卸载并重新安装IE9,看看是否有任何效果。这不是一个可以在公司范围内使用的解决方案,但可能表明他们的IE形象存在一些问题
更新

客户再次复制了该问题,故障模块不是Flash ocx,而是
jscript 9.dll
。他们还报告说在
ntdll.dll
中也看到了同样的情况,尽管我自己还没有看到过

Faulting application name: iexplore.exe, version: 9.0.8112.16575, time stamp: 0x53ee1acb 
Faulting module name: jscript9.dll, version: 9.0.8112.16575, time stamp: 0x53ee1c49 
Exception code: 0xc0000005 
Fault offset: 0x00007264 
Faulting process id: 0x1bb4 
Faulting application start time: 0x01cfec57f247cb53 
Faulting application path: C:\Program Files\Internet Explorer\iexplore.exe 
Faulting module path: C:\Windows\System32\jscript9.dll 
Report Id: 50b58f63-584b-11e4-bc66-6cf0492a8610 
Faulting package full name: %14 
Faulting package-relative application ID: %15

所以我想这会让它变得与闪存无关…

问题是,使用.Net,您几乎无法主动地扰乱内存。因此,除非您经常使用Api调用,否则很难确定是代码中的某些内容导致了错误

在我看来,重新定位dll似乎是最有希望的事情;不干扰GCC似乎也是一个非常好的选择(而且总是这样,不仅仅是在这种情况下)

另一个问题是,不是你的模块是错误的,这是一个值得认真考虑的问题:不是你的代码试图通过另一个DLL,BU到达一个内存区域。