21

I'm working on IE11 Browser Helper Object. I got it working when I build it in x86. The problem is, I want to use the project on x64 the BHO extension isn't working when it's built on x64.

The extension shows up in the Internet Explorer add-ons screen, but the javascript popup is not showing up.

The DLL is registered using the x64 version of regasm via the Visual Studio command prompt as administrator, with/without the /codebase and /tlb but without result. The registry key is added successfully in my registry but the BHO is simply not working in IE. I've also tried placing the files in a subfolder of Program Files, but it simply is not working.

When I run my IE in Enhanced Protected Mode the add-on manager shows that my BHO is incompatible, but without EPM the IE shows enabled even though it's not working.

I'd like to get the BHO working on x64.

I also tried this 'hello world' BHO project but when I change it to build on x64 in stead of x86 the same problem occurs.

Dennis van Dalen
  • 494
  • 3
  • 12
  • 1
    The provided sample works in 64-bit for me. You have to 1) compile x64 2) register using `c:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe ieextension.dll /codebase` (no need to copy to program files thanks to codebase), 3) make sure main iexplore.exe runs 64-bit, 4) make sure "Enable 64-bit processes for Enhanced Protected Mode" is checked in IE"s Tools/Options/Advanced. FYI I don't have "Enable Enhanced Protected Mode" enable. – Simon Mourier Sep 06 '17 at 21:05
  • The [ComRegisterFunction] method looks quite broken to me, it only writes the BHO key but fails to write the CLSID keys. @Simon, how did you get it going? Did you perhaps do the same thing the CodeProject author might have done and have a version of the code without the [ComRegisterFunction] at first? – Hans Passant Sep 13 '17 at 08:09
  • @HansPassant - yes, I forget to say I changed RegisterBHO to `registryKey.OpenSubKey(guid, true);` to be able to write the key, but it's the only change I made. Regasm 64 must be ran as admin (as usual for changes in HKLM) Plus setup IE options as in my previous comments. – Simon Mourier Sep 13 '17 at 08:23
  • Yuck, and that. It still baffles me how anybody got this going, I suspect their projects had the "Register for COM interop" checkbox turned on. But sure, doesn't work in 64-bit mode. And won't work on another machine. Afaik, the [ComRegisterFunction] must call RegistrationServices.RegisterAssembly(Assembly.GetExecutingAssembly(), AssemblyRegistrationFlags.SetCodeBase) so the CLSID keys are properly written so IE can find the DLL and mscoree.dll can load it. – Hans Passant Sep 13 '17 at 09:12
  • @HansPassant - I posted an answer, I think it's mandatory to have both x86 and x64 versions registered for the same CLSID to make IE happy. – Simon Mourier Sep 13 '17 at 18:44

2 Answers2

4

It seems it doesn't work for everyone, so, I'll describe what I did to make it work.

1) download the sample project from here: https://github.com/reinaldo13/ie-bho-extension

2) modify RegisterBHO(...) method in BHO.cs

from:

RegistryKey ourKey = registryKey.OpenSubKey(guid);

to:

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

3) compile the project for AnyCPU: Project properties, select AnyCPU for the platform target.

4) create a .bat like this, adapt yo your path, and copy that aside your outputs 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   

This will register the dll for x86 and x64. This is mandatory to have both version registered otherwise IE won't like it (it will complain the extension is 'incompatible') because it won't be able to start it depending on your IE settings. Note I suppose you can have two different files for each version but .NET's AnyCPU doesn't need that.

5) run that .bat as admin, here is the output when I do this:

"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) run iexplore.exe. It may work depending on your settings (displays a "HOLA!!!" messagebox), but anyway, go to menu Tools / Internet Options / Programs / Manage add-ons, this is what I see:

enter image description here

If the extension is disabled, you should be able to enable it (and restart).

If it doesn't work (by default it shouldn't), make sure you've checked "Enable 64-bit processes for Enhanced Protected Mode*" (needs restart). To me the message is wrong, it should just say "Enable 64-bit processes"...

enter image description here

Simon Mourier
  • 117,251
  • 17
  • 221
  • 269
  • Simon, from the screenshot I see you don't have "Enable Enhanced Protection Mode" ticked. How do you know its using Enhanced Protection Mode? I don't think it is and that is why its working for you. – scott_f Jan 17 '19 at 02:01
0

Regasm.exe (Assembly Registration Tool) HERE

Check your project settings to compile as 64bit and check IE version as well . and run it in Administrator mode.

Your Code is perfect. just the system settings and compilation configurations are messed up ,

also have a look at this setting 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

Hope this will help you out !!

N.K
  • 2,205
  • 1
  • 13
  • 36