【问题标题】:Cannot get BHO working in 64 bit无法让 BHO 在 64 位下工作
【发布时间】:2018-02-10 17:17:33
【问题描述】:

我正在研究 IE11 浏览器助手对象。当我在 x86 中构建它时,我得到了它的工作。问题是,我想在 x64 上使用该项目,BHO 扩展在 x64 上构建时无法正常工作。

扩展显示在 Internet Explorer 加载项屏幕中,但没有显示 javascript 弹出窗口。

以管理员身份通过 Visual Studio 命令提示符使用 x64 版本的 regasm 注册 DLL,带有/不带有 /codebase/tlb 但没有结果。注册表项已成功添加到我的注册表中,但 BHO 根本无法在 IE 中运行。我也尝试将文件放在 Program Files 的子文件夹中,但它根本不起作用。

当我在增强保护模式下运行我的 IE 时,插件管理器显示我的 BHO 是 incompatible,但如果没有 EPM,即使它不工作,IE 也会显示 enabled

我想让 BHO 在 x64 上工作。

我也尝试过this 'hello world' BHO project,但是当我将其更改为基于 x64 而不是 x86 构建时,会出现同样的问题。

【问题讨论】:

  • 所提供的示例适用于我的 64 位。您必须 1) 编译 x64 2) 使用 c:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe ieextension.dll /codebase 注册(由于代码库,无需复制到程序文件),3) 确保主 iexplore.exe 运行 64 位,4) 确保“启用 64 位进程在 IE 的工具/选项/高级中检查了“增强保护模式”。仅供参考,我没有启用“启用增强保护模式”。
  • [ComRegisterFunction] 方法对我来说看起来很糟糕,它只写入 BHO 密钥,但无法写入 CLSID 密钥。 @Simon,你是怎么做到的?你是否可能做了 CodeProject 作者可能做过的同样的事情,并且一开始有一个没有 [ComRegisterFunction] 的代码版本?
  • @HansPassant - 是的,我忘了说我将 RegisterBHO 更改为 registryKey.OpenSubKey(guid, true); 以便能够写入密钥,但这是我所做的唯一更改。 Regasm 64 必须以管理员身份运行(与 HKLM 中的更改一样)加上设置 IE 选项,就像我以前的 cmets 一样。
  • 哎呀,还有那个。它仍然让我感到困惑,有人如何做到这一点,我怀疑他们的项目打开了“注册 COM 互操作”复选框。但可以肯定的是,在 64 位模式下不起作用。并且不会在另一台机器上工作。 Afaik,[ComRegisterFunction] 必须调用 RegistrationServices.RegisterAssembly(Assembly.GetExecutingAssembly(), AssemblyRegistrationFlags.SetCodeBase) 以便正确编写 CLSID 键,以便 IE 可以找到 DLL 并且 mscoree.dll 可以加载它。
  • @HansPassant - 我发布了一个答案,我认为必须为同一个 CLSID 注册 x86 和 x64 版本才能让 IE 满意。

标签: c# windows internet-explorer internet-explorer-11 bho


【解决方案1】:

似乎它并不适合每个人,所以,我将描述我为使它起作用所做的工作。

1) 从这里下载示例项目:https://github.com/reinaldo13/ie-bho-extension

2) 修改BHO.cs中的RegisterBHO(...)方法

来自:

RegistryKey ourKey = registryKey.OpenSubKey(guid);

到:

  RegistryKey ourKey = registryKey.OpenSubKey(guid, true); //we want to write the registry

3) 为AnyCPU编译项目:项目属性,平台目标选择AnyCPU。

4) 像这样创建一个 .bat,调整您的路径,然后将其复制到您的输出 dll 旁边:

 "c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" ieextension.dll /codebase
 "c:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" ieextension.dll /codebase   

这将为 x86 和 x64 注册 dll。这是强制注册这两个版本,否则 IE 将不喜欢它(它会抱怨扩展是“不兼容”),因为它无法根据您的 IE 设置启动它。注意我想每个版本可以有两个不同的文件,但 .NET 的 AnyCPU 不需要。

5) 以管理员身份运行该 .bat,这是我执行此操作时的输出:

"c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" ieextension.dll /codebase
Microsoft .NET Framework Assembly Registration Utility version 4.7.2046.0
for Microsoft .NET Framework version 4.7.2046.0
Copyright (C) Microsoft Corporation.  All rights reserved.

RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can cause your assembly to interfere with other applications that may be installed on the same computer. The /codebase switch is intended to be used only with signed assemblies. Please give your assembly a strong name and re-register it.
Types registered successfully
"c:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" ieextension.dll /codebase
Microsoft .NET Framework Assembly Registration Utility version 4.7.2046.0
for Microsoft .NET Framework version 4.7.2046.0
Copyright (C) Microsoft Corporation.  All rights reserved.

RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can cause your assembly to interfere with other applications that may be installed on the same computer. The /codebase switch is intended to be used only with signed assemblies. Please give your assembly a strong name and re-register it.
Types registered successfully

6) 运行iexplore.exe。它可能会根据您的设置工作(显示“HOLA !!!”消息框),但无论如何,请转到菜单工具/Internet 选项/程序/管理加载项,这就是我所看到的:

如果扩展程序被禁用,您应该能够启用它(并重新启动)。

如果它不起作用(默认情况下不应该),请确保您已选中“为增强保护模式启用 64 位进程*”(需要重新启动)。对我来说消息是错误的,它应该只是说“启用 64 位进程”...

【讨论】:

  • Simon,从截图中我看到你没有勾选“启用增强保护模式”。你怎么知道它使用增强保护模式?我不认为它是,这就是它为你工作的原因。
【解决方案2】:

Regasm.exe(程序集注册工具)HERE

检查您的项目设置以编译为 64 位并检查 IE 版本。并以管理员模式运行。

您的代码是完美的。只是系统设置和编译配置搞砸了,

也看看这个设置 https://answers.microsoft.com/en-us/ie/forum/ie11-windows_7/enable-64-bit-processes-in-ie-11/212270df-cc35-4e09-89e4-13b9da1bb6a7?auth=1

希望对你有所帮助!!

【讨论】:

    猜你喜欢
    • 2011-03-29
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2013-11-10
    • 2019-12-29
    • 2011-01-02
    相关资源
    最近更新 更多