C# 工程注册 BHO 类型的 dll 注册成功,但是注册表没有相应键值,请帮忙

global_biz 2014-06-19 04:22:15
Hi,

http://blog.csdn.net/yanghongchang_/article/details/9998827

我根据上面这个连接创建了一个 C# 工程,在注册 dll 的时候,我修改了下注册方法加入了弹出框,.

然后,在一台 windows 2008 r2 的机器上试验了一下注册这个 dll, 提示注册成功,也会弹出测试框 (System.Windows.Forms.MessageBox.Show("BHO TESTING.2..");). 但是,打开注册表并没有发现那个注册键存在, 请问是什么回事??

我查注册表的时候,发现是到了: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer 这个位置的时候, 在 Explorer 的下面不会有 Browser Helper Objects 这个子目录键存在.

代码是照抄那个连接里面的内容, 只是加多个提示信息在相应方法上.


public static string BHOKEYNAME = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects";

[ComRegisterFunction]
public static void RegisterBHO(Type type)
{
System.Windows.Forms.MessageBox.Show("BHO TESTING.2..");
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BHOKEYNAME, true);

if (registryKey == null)
registryKey = Registry.LocalMachine.CreateSubKey(BHOKEYNAME);

string guid = type.GUID.ToString("B");
RegistryKey ourKey = registryKey.OpenSubKey(guid);

if (ourKey == null)
ourKey = registryKey.CreateSubKey(guid);

ourKey.SetValue("Alright", 1);
registryKey.Close();
ourKey.Close();
}

[ComUnregisterFunction]
public static void UnregisterBHO(Type type)
{
System.Windows.Forms.MessageBox.Show("BHO TESTING..3.");
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BHOKEYNAME, true);
string guid = type.GUID.ToString("B");

if (registryKey != null)
registryKey.DeleteSubKey(guid, false);
}


Thanks.
...全文
182 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
_BAO_GAN_CPP 2016-12-02
  • 打赏
  • 举报
回复
因为你写的注册表值被重定位到下面这个位置去了 HKEY_LOCAL_MACHINE\Software\WOW6432Node。 你可以用程序中的类在GUID到注册表中搜一下就skn 是因为64位OS的问题。 http://blog.csdn.net/pbymw8iwm/article/details/6931120
global_biz 2014-06-19
  • 打赏
  • 举报
回复
我重新将上面的 dll 放到 windows server 2003 上面运行, 同样的结果却成功注册与成功在 IE 运行 BHO. 这个问题是与 OS 的版本有关, 谢谢.
global_biz 2014-06-19
  • 打赏
  • 举报
回复
然后, 可能是因为注册表的键值也没有, 所以, 当我打开 IE 测试 BHO 的时候, 好像根本就没反应, 下面的代码没有在页面加载完成的时候被调用: 没有弹出: System.Windows.Forms.MessageBox.Show("BHO TESTING...");

public class BHO : IObjectWithSite
{
    WebBrowser browser;
    HTMLDocument document;

    public void OnDocumentComplete(object pDisp, ref object URL)
    {
        System.Windows.Forms.MessageBox.Show("BHO TESTING...");
    }

    public int SetSite(object site)
    {
        if (site != null)
        {
            browser = (WebBrowser)site;
            browser.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
        }
        else
        {
            browser.DocumentComplete -= new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
            browser = null;
        }
        return 0;
    }

    public int GetSite(ref Guid guid, out IntPtr ppvSite)
    {
        IntPtr punk = Marshal.GetIUnknownForObject(browser);
        int hr = Marshal.QueryInterface(punk, ref guid, out ppvSite);
        Marshal.Release(punk);
        return hr;
    }
.....
global_biz 2014-06-19
  • 打赏
  • 举报
回复
引用 1 楼 feiyun0112 的回复:
可能程序没执行成功 把System.Windows.Forms.MessageBox.Show("BHO TESTING.2.."); 放到ourKey.Close();后面看看
我重新改了下弹出框,加多了输出,然后,测试的时候,是输出下面结果: 弹出框 2,6,8,10,11,12,13 这几个弹出框都弹出来,然后, cmd 提示注册成功. C:\Users\Administrator>"C:\Program Files (x86)\Test Program\tools\x86\RegAsm.exe " /codebase "D:\TestBHO.dll" Microsoft (R) .NET Framework Assembly Registration Utility 2.0.50727.5420 Copyright (C) Microsoft Corporation 1998-2004. All rights reserved. RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can ca use 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 以下是修改后的代码:


public static string BHOKEYNAME = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects";

[ComRegisterFunction]
public static void RegisterBHO(Type type)
{
    System.Windows.Forms.MessageBox.Show("BHO TESTING.2..");
    RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BHOKEYNAME, true);

    if (registryKey == null)
    {
        System.Windows.Forms.MessageBox.Show("BHO TESTING.4..");
        registryKey = Registry.LocalMachine.CreateSubKey(BHOKEYNAME);
    }

    System.Windows.Forms.MessageBox.Show("BHO TESTING.6.." + BHOKEYNAME);

    string guid = type.GUID.ToString("B");
    RegistryKey ourKey = registryKey.OpenSubKey(guid);

    System.Windows.Forms.MessageBox.Show("BHO TESTING.8.." + guid);

    if (ourKey == null)
    {
        System.Windows.Forms.MessageBox.Show("BHO TESTING.10.." + guid);
        ourKey = registryKey.CreateSubKey(guid);
        System.Windows.Forms.MessageBox.Show("BHO TESTING.11.." + ourKey);
    }

    ourKey.SetValue("Alright", 1);
    System.Windows.Forms.MessageBox.Show("BHO TESTING.12.." + ourKey);

    registryKey.Close();
    ourKey.Close();

    System.Windows.Forms.MessageBox.Show("BHO TESTING.13..");
}

[ComUnregisterFunction]
public static void UnregisterBHO(Type type)
{
    System.Windows.Forms.MessageBox.Show("BHO TESTING..3.");
    RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BHOKEYNAME, true);
    string guid = type.GUID.ToString("B");

    System.Windows.Forms.MessageBox.Show("BHO TESTING.5.." + guid);

    if (registryKey != null)
    {
        registryKey.DeleteSubKey(guid, false);
        System.Windows.Forms.MessageBox.Show("BHO TESTING.7.." + guid);
    }
    System.Windows.Forms.MessageBox.Show("BHO TESTING.9.." + guid);
}
feiyun0112 2014-06-19
  • 打赏
  • 举报
回复
可能程序没执行成功

把System.Windows.Forms.MessageBox.Show("BHO TESTING.2..");

放到ourKey.Close();后面看看
BHO(Browser Helper Object,浏览器辅助对象,简称BHO)   BHO是微软推出的作为浏览器对第三方程序员开放交互接口的业界标准,通过简单的代码就可以进入浏览器领域的“交互接口”(INTERACTIVED Interface)。通过这个接口,程序员可以编写代码获取浏览器的行为,比如“后退”、“前进”、“当前页面”等,利用BHO的交互特性,程序员还可以用代码控制浏览器行为,比如修改替换浏览器工具栏,添加自己的程序按钮等。这些在系统看来都是没有问题的。BHO原来的目的是为了更好的帮助程序员打造个性化浏览器,以及为程序提供更简洁的交互功能,现在很多IE个性化工具就是利用BHO的来实现。 编辑本段 技术优势   “浏览器劫持”是一种不同于普通病毒木马感染途径的网络攻击手段,而是使用各种技术(如DLL插件等)插件对用户的浏览器进行篡改。安装后,它们会成为浏览器的一部分,可以直接控制浏览器进行指定的操作,根据需要,可以让你打开指定的网站,甚至是收集你系统中的各种私密信息。最可怕的是只有当浏览器已经被劫持了,你才会发现,反应过来,原来电脑已经出现了问题。比如IE主页被改,开机就会弹出广告等等。目前,浏览器劫持已经成为Internet用户最大的威胁之一。其实“浏览器劫持”就是通过BHO的技术手段进入你的系统的,而这种技术是合法的。   从某种观点看,Internet Explorer同普通的Win32程序没有什么两样。借助于BHO,你可以写一个进程内COM对象,这个对象在每次启动时都要加载。这样的对象会在与浏览器相同的上下文中运行,并能对可用的窗口和模块执行任何行动。例如,一个BHO能够探测到典型的事件,如GoBack、GoForward、DocumentComplete等;另外BHO能够存取浏览器的菜单与工具栏并能做出修改,还能够产生新窗口来显示当前网页的一些额外信息,还能够安装钩子以监控一些消息和动作。 编辑本段 注册表位置   BHO注册表中的位置是:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects,有兴趣的朋友可以在这里做做实验。不过一定要记住你更改的每一步,否则会出错的哦!   BHO对象依托于浏览器主窗口。实际上,这意味着一旦一个浏览器窗口产生,一个新的BHO对象实例就要生成。任何 BHO对象与浏览器实例的生命周期是一致的。其次, BHO仅存在于Internet Explorer 4.0及以后版本中。   如果你在使用Microsoft Windows? 98, Windows 2000, Windows 95, or Windows NT版本4.0 操作系统的话,也就一块运行了活动桌面外壳4.71,BHO也被 Windows资源管理器所支持。 BHO是一个COM进程内服务,注册注册表中某一下。在启动时,Internet Explorer查询那个并把该下的所有对象预以加载。   迅雷中TDAtOnce_Now.dll和xunleiBHO_Now.dll为安全   如何发现BHO里面的危险模块.   首先有一个能够查看进程的软件 冰刃就不错 下面以它为例:   先打开冰刃—会看到一个BHO在这里就可以看到危险BHO进程了

110,580

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧