注册DLL

方法:调用DllRegisterServer函数法

既然方法一不大实用,那么我们就来寻找一种真正实用的方法来达到我们的目的吧。研究Regsvr32.exe和Dll文件,我们会发现,其实每个需 要注册的文件都包括一个DllRegisterServer()方法,Regsvr32.exe就是通过调用该方法来完成Dll的注册的。呵呵,知道了这 个,我们就可以自己调用DllRegisterServer()来完成注册过程啦。

首先,还得引入外部方法:

  1. [DllImport("DllTest.dll")]  
  2. public static extern int DllRegisterServer();//注册时用  
  3. [DllImport("DllTest.dll")]  
  4. public static extern int DllUnregisterServer();//取消注册时用 

接下来就不难啦:

  1. int i = DllRegisterServer();  
  2. if (i >= 0)  
  3. {  
  4.     //注册成功!  
  5. }  
  6. else 
  7. {  
  8.     //注册失败} 

取消注册的过程就不应再贴代码啦。

两种方法介绍完啦,可是好像还缺点什么?对了,那就是对Dll是否已经注册过了的判断。一般情况下,我们可以将对Dll控件的注册过程放在系统启动 的过程中来完成,但是,总不能每次启动都注册一次吧?这样做显然不合理。那么,我们就来判断一下,当前Dll是否已经注册过,如果已注册过,就跳过注册过 程。

每一个Dll的注册都会在注册表里记录下有关它本身的资料,如注册路径,唯一ID等。我们这里就是利用它留下的唯一ID号来判断:

  1. RegistryKey rkTest = Registry.ClassesRoot.OpenSubKey
  2. ("CLSID\\{7713F78A-44DE-42BA-A1F6-3FB0BD6CA63B}\\");  
  3. 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啦。简单我就不多说啦。

posted @ 2010-04-30 22:39  翔宇编程  阅读(463)  评论(0编辑  收藏  举报
51CTO