zoukankan      html  css  js  c++  java
  • C# 获取COM控件注册状态,注册以及反注册COM控件

      每一个COM控件都有一个全球唯一的标识,CoClass的GUID,简称CLSID;

      每一个COM控件注册后,都会在注册表中的 “HKEY_CLASSES_ROOTCLSID”键下创建一个以COM控件的CLSID命名的键(带大括号),所以判断一个COM控件是否注册,可在 “HKEY_CLASSES_ROOTCLSID”键下查看是否存在以该COM控件的CLSID命名的注册表键。代码如下:

      

     1  /// <summary>
     2         /// 检查指定CLSID的COM控件是否注册
     3         /// </summary>
     4         /// <param name="clsid">COM控件的CLSID,不带大括号</param>
     5         /// <returns>是否已经注册</returns>
     6         public static bool GetRegisterStatus(string clsid)
     7         {
     8             bool hasRegister = false;
     9             RegistryKey root = RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry32);
    10             string cld = String.Format("\CLSID\{0}{1}{2}", "{", clsid, "}");
    11             RegistryKey comKey = root.OpenSubKey(cld);
    12             hasRegister = comKey != null;
    13             return hasRegister;
    14         }

      在每一个已注册的COM控件对应的注册表键下,都会保存其文件信息,可能会保存版本信息和其他信息,所以可以从注册表中获取该COM控件的文件所在位置。如下所示:

     1        /// <summary>
     2         /// 检查指定CLSID的COM控件是否注册,并返回文件信息
     3         /// </summary>
     4         /// <param name="clsid">COM控件的CLSID,不带大括号</param>
     5         /// <param name="file">文件信息</param>
     6         /// <returns>是否已经注册</returns>
     7         public static bool GetRegisterStatus(string clsid, out FileInfo file)
     8         {
     9             file = null;
    10             RegistryKey root = RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry32);
    11             string cld = String.Format("\CLSID\{0}{1}{2}", "{", clsid, "}");
    12             RegistryKey comKey = root.OpenSubKey(cld);
    13             if (comKey == null) return false;
    14 
    15             RegistryKey fileKey = comKey.OpenSubKey("InprocServer32");
    16             if (fileKey == null) return false;
    17             string filename = fileKey.GetValue("").ToString();
    18             if (!string.IsNullOrEmpty(filename))
    19             {
    20                 file = new FileInfo(filename);
    21             }
    22             return true;
    23         }


    关于COM控件的注册方法,可调用系统文件夹(system32)下的Regsvr32.exe来注册。

    具体使用方法为:创建一个进程,运行Regsvr32文件,再将注册和反注册选项,文件信息等作为运行参数,然后启动进程即可。进程运行结束后,可采用上述方法来验证是否完成注册或反注册。

    创建进程:

     1         /// <summary>
     2         /// 根据指定的文件名创建一个运行Regsvr32的Process
     3         /// </summary>
     4         /// <param name="filename">文件绝对路径</param>
     5         /// <param name="register">注册/反注册</param>
     6         /// <returns></returns>
     7         private static Process GetRegsvr32(string filename, bool register)
     8         {
     9             if (!File.Exists(filename)){ return null;}
    10             Process p = new Process();
    11             p.StartInfo.FileName = string.Format("{0}\{1}", Environment.GetFolderPath(Environment.SpecialFolder.System),
    12                 "regsvr32.exe");
    13             p.StartInfo.Arguments = string.Format("/s {0}", filename);
    14             if (!register)
    15             {
    16                 p.StartInfo.Arguments += " /u";
    17             }
    18 
    19             return p;
    20         }
  • 相关阅读:
    《O2O实战:他们是如何利用互联网的》.pdf
    建议收藏,mybatis插件原理详解
    《Tensorflow:实战Google深度学习框架》.pdf
    MyBatis插件原理及应用(上篇)
    《大数据算法》.pdf
    答了Mybatis这个问题后,面试官叫我回去等通知……
    《构建高性能WEB站点》.pdf
    SpringBoot 构建 Docker 镜像的最佳 3 种方式
    快速了解阿里微服务热门开源分布式事务框架——Seata
    超值干货 | 建议收藏:精美详尽的 HTTPS 原理图注意查收!
  • 原文地址:https://www.cnblogs.com/pengcwl/p/3412084.html
Copyright © 2011-2022 走看看