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

C#自动实现Dll(OCX)控件注册的两种方法2012-07-31 21:20

C#自动实现Dll(OCX)控件注册的两种方法尽管MS为我们提供了丰富的.net framework库,我们的程序C#开发带来了极大的便利,但是有时候,一些特定功能的控件库还是需要由第三方提供或是自己编写。
当需要用到Dll引用的时候,我们通常会通过“添加引用”的方式将它们纳入到项目中,然后就可以像使用自己的类一样方便的使用它们了。
但是,有些Dll库(OCX)文件是需要注册到Windows注册表后才能正常添加和使用的。
本文介绍两种为Dll库(OCX)自动注册的方法,为大家提供参考。
首先,大家都知道在Windows的“运行”中,输入“Regsvr32.exe 路径”这样的方法来手动注册Dll控件(OCX),显示这种方法对于程序的自动化部署等带来极大的不便,
因此,今天我们着重介绍如何用C#实现自动注册。
方法一:调用Regsvr32法
既然可以在运行栏中输入“Regsvr32.exe 路径”的方法来注册,那么,一定可以在C#程序中采用同样的方法来调用Regsvr32,以实现注册:
Process p = new Process();
p.StartInfo.FileName = "Regsvr32.exe";
p.StartInfo.Arguments = "/s C:\\DllTest.dll";//路径中不能有空格
p.Start();
采用这种方法,注意要添加对命名空间System.Diagnostics的引用:using System.Diagnostics;
另外,这种方法有一个不足之处,那就是注册工作是在本程序之外由Regsvr32.exe程序来完成的,系统内不方便知道注册的结果,也不方便对注册过程弹出的对话框进行自定义和控制。
这里附Regsvr32的参数说明:(感谢网友伍华聪的提醒)
regsvr32.exe是32位系统下使用的DLL注册和反注册工具,使用它必须通过命令行的方式使用,格式是:
  regsvr32 [/i[:cmdline]] DLL文件名
  命令可以在“开始→运行”的文本框中,也可以事先在bat批处理文档中编写好命令。未带任何参数是注册DLL文件功能,其它参数对应功能如下:
  /u:反注册DLL文件;
  /s:安静模式(Silent)执行命令,即在成功注册/反注册DLL文件前提下不显示结果提示框。
  /c:控制端口;
  /i:在使用/u反注册时调用DllInstall;
  /n:不调用DllRegisterServer,必须与/i连用。

方法二:调用DllRegisterServer函数法
研究Regsvr32.exe和Dll文件,我们会发现,其实每个需要注册的文件都包括一个DllRegisterServer()方法,Regsvr32.exe就是通过调用该方法来完成Dll的注册的。
知道了这个,我们就可以自己调用DllRegisterServer()来完成注册过程啦。
首先,还得引入外部方法:
[DllImport("DllTest.dll")]
public static extern int DllRegisterServer();//注册时用
[DllImport("DllTest.dll")]
public static extern int DllUnregisterServer();//取消注册时用
接下来就不难啦:int i = DllRegisterServer();
if (i >= 0)
{
    //注册成功!
}
else
{
    //注册失败
}
取消注册的过程就不应再贴代码啦。

如何对Dll是否已经注册过了做出判断?
一般情况下,我们可以将对Dll控件的注册过程放在系统启动的过程中来完成,但是,总不能每次启动都注册一次吧?这样做显然不合理。
那么,我们就来判断一下,当前Dll是否已经注册过,如果已注册过,就跳过注册过程。
每一个Dll的注册都会在注册表里记录下有关它本身的资料,如注册路径,唯一ID等。我们这里就是利用它留下的唯一ID号来判断:
RegistryKey rkTest = Registry.ClassesRoot.OpenSubKey("CLSID\\{7713F78A-44DE-42BA-A1F6-3FB0BD6CA63B}\\");
if (rkTest == null)
{  
//Dll没有注册,在这里调用DllRegisterServer()吧

注意要添加对命名空间Microsoft.Win32的引用:using Microsoft.Win32;
其中的“{7713F78A-44DE-42BA-A1F6-3FB0BD6CA63B}”就是该Dll的唯一ID啦,每一个Dll文件都会不一样的。
但是,问题又来了,怎么样知道它的唯一ID呢?其实很简单,那就是“逆向思维”。
我们可先注册这个Dll文件,然后到注册表的“HKEY_CLASSES_ROOT\CLSID”分支下“查找”Dll的名称或路径,就可以看到这个ID啦。

ocx注册以及检测(转)相关推荐

  1. windows系统下注册和检测 ocx,dll控件的问题.........

    in fact ...ocx控件注册和检测其实是对注册表中的相应的项注册和检测,当然注册表那些操作函数就不能不用到: 注册ocx控件无非两句话的功夫, 1.在系统目录下即:C:/windows/sys ...

  2. ajax用户名注册自动刷新,ajax+jsp实现 无刷新页面下注册时检测用户名是否已存在...

    当前位置:编程学习 > JAVA >> ajax+jsp实现 无刷新页面下注册时检测用户名是否已存在 如题:ajax+jsp实现 无刷新页面下注册时检测用户名是否已存在 求大神们赐教 ...

  3. C#通过操作注册表检测office版本

    在编写毕业论文辅助编辑软件时,需要检测用户是否安装office以及office的版本,后来在网上找到通过注册表检测的方法,不过由于Windows32位软件和64位软件操作的注册表是不同的,关于这个问题 ...

  4. 【VC6.0TeeChart5.ocx注册方法】

    VC6.0 TeeChart5.ocx注册方法: (1)下载好TeeChart5.ocx: (2)32位系统将其放在C:\WINDOWS\System32目录下,64位系统将其放在C:\WINDOWS ...

  5. 通过注册表检测是否安装了VC++ 2008 SP1 redistributable。

    在发布 vs2008 程序时,往往会发现程序在某些电脑上无法运行.原因是目标电脑上没有相关的VC运行库. 最简单的方法,就是到微软的官网上下载并安装最新的 Visual C++ 2008 SP1 re ...

  6. WIN7 64位 OCX注册

     参考: http://blog.csdn.net/leidengyan/article/details/7577559 出现: 可能与您正在运行的windows版本不兼容.检查该模块是否与 re ...

  7. u9过期老玉米挖掘软件V2版-过期域名采集软件-网址采集软件-域名采集软件-未注册域名检测软件-老域名采集工具

    更多介绍可以观看官网:https://www.u9seo.com/product/295.html 视频演示: http://file.iui8.com/v2.mp4?_=1 功能介绍: 购买联系客服 ...

  8. ajax 用户已注册,Ajax检测用户名是否已经注册

    程序功能 当用户名输入完成(即用户名输入框失去焦点),利用Ajax检测用户名是否已经注册! 实现过程 利用Ajax向CheckUserServlet发送请求,判断该用户名是否可用.这里只是为了演示Aj ...

  9. winform 通过驱动注册ID检测是否已安装驱动

    1 public bool IsRegistered() 2 { 3 string clsid = ConfigurationManager.AppSettings["clsid" ...

  10. Msflxgrd.ocx注册失败解决方法

    第一步.将Msflxgrd.ocx拷贝至C:\Windows\SysWOW64目录下: 第二步.在C:\Windows\System32中找到cmd.exe,右键点击"以管理员身份运行&qu ...

最新文章

  1. 神经网络迭代次数与Lambert定律
  2. python 多线程中的 join 和 daemon
  3. 远洋整站下载器不能用https_最后下载个喜马拉雅
  4. 好看的a标签按钮样式
  5. BMVC2018图像检索论文—使用区域注意力网络改进R-MAC方法
  6. 推荐几个win8系统下载比较好的网站
  7. Visual Studio 2005 开发 Silverlight 1.0
  8. Mac电脑:Flutter开发环境配置小白教程
  9. AtCoder题解集锦
  10. 使用iconv进行GBK到BIG5编码转/简繁转换遇到的问题
  11. 思岚A1M8激光雷达-ubuntu18.04-slam建图参考
  12. mysql 实现api接口_一套免费MySQL数据库数据接口API,让项目开发更简单
  13. 淘宝最新开店卖家店铺采集工具能采集同行信誉等级高的店铺吗
  14. [数学 悖论/理论]-(1) 直角三角形两边之和等于第三边!
  15. 【读书笔记】《全域营销:付费增长与流量变现实战讲义》——我的公域私域运营教科书
  16. xadmin安装与使用
  17. 小米实习面试总结(1)
  18. 招商银行、伊利股份套利模型(1)
  19. 2019创业新项目手游充值代理是骗人的还是风口?
  20. 鸡兔同笼:笼子里一共有鸡和兔子35只,一共有94条退, 笼子里一共有鸡和兔子共多少只

热门文章

  1. 宏观经济模型代码来源 :MMB库
  2. MongoDB可视化管理工具-Robo 3T
  3. istio搭建testbed 补充(指令汇集)
  4. socket服务器主动下发消息,socket服务器主动发送消息给客户端
  5. dnf连不上服务器删什么文件,DNF客户端又出问题?其实是这个文件惹的祸,删除就好了!...
  6. 光学设计软件ZEMAX的安装与基本操作
  7. Mac 下安装pip,卸载pip方法
  8. 科赫雪花c语言程序设计,用 C 语言画科赫雪花
  9. 数组和集合的互相转换
  10. 计算机流体力学:CFD