注册DLL
方法:调用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啦。简单我就不多说啦。
喜欢技术、热爱生活。