概述
每一个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 }
转载于:https://www.cnblogs.com/pengcwl/p/3412084.html
最后
以上就是甜美煎饼为你收集整理的C# 获取COM控件注册状态,注册以及反注册COM控件的全部内容,希望文章能够帮你解决C# 获取COM控件注册状态,注册以及反注册COM控件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复