尽管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 [/u] [/s] [/n] [/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的引用:
其中的“{7713F78A-44DE-42BA-A1F6-3FB0BD6CA63B}”就是该Dll的唯一ID啦,每一个Dll文件都会不一样的。但是,问题又来了,怎么样知道它的唯一ID呢?其实很简单,那就是“逆向思维”。我们可先注册这个Dll文件,然后到注册表的“HKEY_CLASSES_ROOT/CLSID”分支下“查找”Dll的名称或路径,就可以看到这个ID啦。简单我就不多说啦。
分享到:
相关推荐
自动实现自动实现DLL(OCX)控件注册,通过几种方法实现控件的系统注册。
海康威视摄像头OCX控件,可以显示摄像头图像、抓取图像、保存图像等,在C#、VB、组态王中都可以使用。 带:OCX控件接口说明(V2.3).doc
通过调用第三方库(lib、dll、.h)文件,封装为ocx控件,该工程主要实现了视频监控中得多屏显示
c# 皮肤控件 OCX控件 IrisSkin2.dll
C# 中调用 dll ocx 的示例 调用及取值的方法
包括dsoframer.ocx和四个.dll文件。运行dsoframer.ocx.exe,安装到 c:\windows\system32下面,相当于把dsoframer.ocx文件拷贝到该文件下下面。然后将四个.dll文件拷贝到相同的路径下面。之后进行注册。步骤开始菜单...
在c#中怎样调用VC写的OCX控件,主要有两个关键环节 两个关键环节:导入ocx控件,创建实例。1 注册ocx: 代码如下:regsvr32.exe alasunsmscon.ocx 2 在CMD窗口中执行: 代码如下:AxImp.exe alasunsmscon.ocx生成两个...
将ocx和DLL文件打包成cab文件,实现IE浏览器在线安装 我们打开淘宝等网站时,IE浏览器会提示安装空间,这个控件便是用于对用户名密码进行加密的ActiveX控件。如何在我们的站点上安装如此控件,让用户可以通过简单的...
C#编写ActiveX控件,使用VS2008开发,亲测可用,里面两个方法int Test(int x, int y),string ShowMsg(),并提供IE调用的页面例子。 先用RegAsm.exe对控件进行注册,Cmd命令进入下载解压后的目录(cd命令应该会吧~-~...
可以播放gif动画的dll控件,让窗体更丰富!
VC6.0/MFC/C#中经常需要使用MS CHART控件来做图表,但他们本身不自带这个控件,所以需要我们自己下载OCX文件并进行注册。 注册方法: 1.XP系统下:将解压出来的MSCHRT20.OCX,msdatasrc.dll拷贝到C:\WINDOWS\SYSTEM...
众所周知,通过Assembly Manifests,我们可以免注册调用各种进程内的COM组件,包括DLL组件和OCX控件等。这里提供一个用于快速创建Assembly Manifest文件的工具。这个工具本身就是通过Assembly Manifests来免注册调用...
包括dsoframerOCX控件 控件注册脚本 C#例程
打印条形码控件,安装后可集成到VB C#等源码中 打印条形码动态库
重新发布简单:最多只需分发两个 DLL 文件。 易学易用:完全可视化设计,完善的复制/剪切/粘贴(Copy/Cut/Paste)和恢复与重做(Undo/Redo)功能。 编写了完整详尽的帮助文档。提供了丰富例程,包括VB.NET...
开发的软件用到了mschart控件。在部署时由于在每台客户端安装mschart太过繁琐。只要把这6个dll文件复制到程序目录下打包发布即可。ps:在网络上找了很多方法;如注册mxcrt20.ocx都木有成功。
包括32位DLL和OCX组件。可在各种流行的开发工具中使用.VeCAD工具包中也包括一个强大的C基于VeCAD引擎的CAD编辑器。 VB矢量绘图控件Vecad6.1,带注册码,这个是真正的6.1版本的,网上其它网站提供的所谓6.1其实是6.0版本...
控件注册: 控件注册,命令为: regsvr32 Asocx.ocx 解除注册: regsvr32 Asocx.ocx /u3.功能说明:选择:单击鼠标左键选择元素; 框选:在选择状态下,按住鼠标托动进入框选状态; 选择移动元素:在选择状态下,...
4.Flash.ocx 要附带在应用程序的根目录下,防止系统没有装Flash插件,自动注册 5.正常引用是不会报异常的,如果有异常,通常把 Interop.ShockwaveFlashObjects.dll, AxInterop.ShockwaveFlashObjects.dll, 放到...