---恢复内容开始---
最近帮公司开发一个类似于帮助文档的应用时用到了dsoframer.ocx控件,它是由微软提供一款开源的用于在线编辑的控件,其中包括注册,和使用方法网上已经有了许多的教程.可是当我按照各位前辈的教程开发完了自己的应用时我发现我写的东西竟然在别人的电脑上运行不了,why?因为使用者的PC上也要注册dsoframer.ocx才可以运行,而我的应用是专门供非开发人员使用的.要他们自己将控件放入系统盘制定位置,然后再使用命令行注册未免不太现实,关于也影响用户体验.这个网上也有大神给出解决方案.但因为我才疏学浅,多次尝试无果后,我只有自己思考解决方案了,下面给出我的解决方案:
1.编写好注册用的bat,其中32位和64稍有差别,如下所示
//32位 copy dsoframer.ocx c:\windows\system32\dsoframer.ocx regsvr32.exe c:\windows\system32\dsoframer.ocx //64位 copy dsoframer.ocx c:\windows\SysWOW64\dsoframer.ocx regsvr32.exe c:\windows\SysWOW64\dsoframer.ocx
2.因为是相对路径所以要存放好dsoframer.ocx控件,两个文件夹放入和打包好的应用同一个文件夹中,如下图所示
3.具体实现代码:
//这段判断代码放入构造方法中,因为如果在只有在构造方法里才没有开始加载控件,否则计算机加载完了from才发现没有这个控件,那就会直接报错 bool isRegisted = IsRegistered("00460182-9E5E-11D5-B7C8-B8269041DD57");//这是注册表里的序列,32和64是一样的 if (!isRegisted) { RegisterDso(); } //判断控件是否已经注册 private static bool IsRegistered(String CLSID) { if (String.IsNullOrEmpty(CLSID)) return false; String key = String.Format(@"CLSID\{{{0}}}", CLSID); RegistryKey regKey = Registry.ClassesRoot.OpenSubKey(key); if (regKey != null) return true; else return false; } /// <summary> /// 注册Dsoframer /// </summary> private void RegisterDso() { string targetDir = ""; string reg = ""; //判断计算机操作系统具体位数32和64区别开 if (Environment.Is64BitOperatingSystem) { targetDir = System.Windows.Forms.Application.StartupPath + "\\64注册\\";//string.Format();//路径 reg = "reg64.bat"; } else { targetDir = System.Windows.Forms.Application.StartupPath + "\\32注册\\";//string.Format();//路径 reg = "reg32.bat"; } Process proc = new Process(); proc.StartInfo.WorkingDirectory = targetDir; proc.StartInfo.FileName =reg; proc.StartInfo.Arguments = string.Format("10"); proc.StartInfo.CreateNoWindow = false; proc.StartInfo.Verb = "runas";//管理员运行 proc.Start(); proc.WaitForExit(); }
以上就是我的方案具体实现,第一次写博客,若有不对还请各位不吝赐教.谢谢观看!
---恢复内容结束---
时间: 2024-10-11 00:13:46