zoukankan      html  css  js  c++  java
  • dll的注册与反注册

    regsvr32.exe是32位系统下使用的DLL注册和反注册工具,使用它必须通过命令行的方式使用,格式是:
    regsvr32 [/i[:cmdline]] DLL文件名
    命令可以在“开始→运行”的文本框中,也可以事先在bat批处理文档中编写好命令。未带任何参数是注册DLL文件功能,其它参数对应功能如下:
    /u:反注册DLL文件;
    /s:安静模式(Silent)执行命令,即在成功注册/反注册DLL文件前提下不显示结果提示框。
    /c:控制端口;
    /i:在使用/u反注册时调用DllInstall;
    /n:不调用DllRegisterServer,必须与/i连用。

    在C#中,可以使用Process来调用regsvr32.exe实现dll的自动注册

    /// <summary>
    /// 注册
    /// </summary>
    /// <param name="dllFile"></param>
    public void Regist(string dllFile)
    {
        if (dllFile.Contains(' ') == true)
        {
            throw new Exception("路径中有空格,无法注册!");
        }
    
        Process p = new Process();
        p.StartInfo.FileName = "Regsvr32.exe";
        p.StartInfo.Arguments = String.Format("/s {0}", dllFile);//路径中不能有空格
        p.Start();
    }
    
    /// <summary>
    /// 反注册
    /// </summary>
    /// <param name="dllFile"></param>
    public void UnRegist(string dllFile)
    {
        if (dllFile.Contains(' ') == true)
        {
            throw new Exception("路径中有空格,无法注册!");
        }
    
        Process p = new Process();
        p.StartInfo.FileName = "Regsvr32.exe";
        p.StartInfo.Arguments = String.Format("/u /s {0}", dllFile);//路径中不能有空格
        p.Start();
    }

    但是,上面的方法无法获取到注册的结果。 

    第二种注册方法,这种方法可以获取到注册的结果:

    [DllImport("DllTest.dll")]
    public static extern int DllRegisterServer();//注册时用
    [DllImport("DllTest.dll")]
    public static extern int DllUnregisterServer();//取消注册时用
    int i = DllRegisterServer();
    if (i >= 0)
    {
        //注册成功!
    }
    else
    {
        //注册失败
    }

    如何判断是否已经注册,以避免重复注册:

    RegistryKey rkTest = Registry.ClassesRoot.OpenSubKey("CLSID\{7713F78A-44DE-42BA-A1F6-3FB0BD6CA63B}\");
    if (rkTest == null)
    {  
        //Dll没有注册,在这里调用DllRegisterServer()吧

    上面的{7713F78A-44DE-42BA-A1F6-3FB0BD6CA63B}是dll的唯一ID,可以通过先注册该dll,到注册表的“HKEY_CLASSES_ROOTCLSID”分支下“查找”Dll的名称或路径,就可以看到这个ID。

    转载自:http://home.51.com/heiyijiushi/diary/item/10053693.html

  • 相关阅读:
    P2764 最小路径覆盖问题
    P2598 [ZJOI2009]狼和羊的故事
    P2472 [SCOI2007]蜥蜴
    P2057 [SHOI2007]善意的投票 / [JLOI2010]冠军调查
    P2050 [NOI2012]美食节
    P1345 [USACO5.4]奶牛的电信Telecowmunication
    P1251 餐巾计划问题
    hihocoder 1584 Bounce
    [CF132C] Logo Turtle
    CF1110D Jongmah
  • 原文地址:https://www.cnblogs.com/hibernation/p/3794140.html
Copyright © 2011-2022 走看看