软件绿化之注册DLL

有些程序集DLL需要注册,但注册后,发生了什么,恐怕很少有人知道,是不是就把DLL复制到了系统目录下?

   注册DLL需要命令regsvr32,具体帮助可以运行 regsvr32 /?

   注册DLL发生了什么?写了注册表HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\,那么是不是HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\下边的所有的都是DLL呢。

  不是,如果你安装了SVN的客户端工具TortoiseSVN,就会发现根本不是,TortoiseSVN把许多Common Files\TortoiseOverlays下的图片也放在了HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\,但这两种在注册表上有什么区别呢?

 区别是对应的DLL键下多了InprocServer32,那是不是不通过regsvr32也可以注册DLL呢,通过我在win7上的实验是可以的,如果使用一个和DLL自己不同的GUID会不会成功,自己没有试验

例如注册好压的DLL,下边的三条注册表修改语句就完成了注册DLL的任务,当然前提条件是你必须知道DLL的GUID,也就是说regsvr32注册DLL也就是向注册表中添加了三条记录。

 reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{5FED836A-C96C-4d88-A91E-F63F07726585" /ve   /d "HaoZip Shell Extension"  /f
 reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{5FED836A-C96C-4d88-A91E-F63F07726585}\InprocServer32" /ve   /d "%cd%\HaoZipExt.dll"  /f
 reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{5FED836A-C96C-4d88-A91E-F63F07726585}\InprocServer32" /v "ThreadingModel"   /d "Apartment"  /f
 
 
regsvr32 HaoZipExt.dll

  有些DLL注册后,可能修改的不只是HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\,有可能修改注册表其他的位置,所以不建议直接使用注册表语句注册DLL。

  例如腾讯的有些需要注册的DLL还会修改注册表如下的位置

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\


  通过我的分析没有向系统文件夹下的System32下复制文件,至少win7没有。现在有一个问题DLL的GUID是注册时系统生成的?还是在DLL中呢?

 写过程序的人都知道GUID在DLL中,不是在注册时生成的,也就是说对于某一个固定的DLL,只要不重新生成DLL,GUID是不会改变的,不管注册多少次。当然如果重新编译生成了DLL就有可能改变了。

   通过试验,明白了,通过regsvr32注册DLL就是向注册表中HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\下写了注册表,关键是下边添加了InprocServer32项

并没有向系统文件下复制文件,GUID是保存在DLL中的,而不是注册时才生成的。

    另外需要注册的DLL其实就是com,使用一些函数到处工具会发现 , 都可以导出如下4个函数 llCanUnloadNowDllGetClassObjectDllRegisterServerDllUnregisterServer

在注册表中的HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\下有相应的注册信息,关键是包含一个HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\DLLGUID\InprocServer32


注意:主要注册的DLL,并不一定是以DLL为后缀的,也有可能使用其他的后缀,例如ocx就是一种很常见的需要注册的DLL,从正式的角度讲需要注册的DLL都是COM,具体可以查询COM相关资料。


文章欢迎转载,但请保留作者信息
xuexiaodong2009

你可能感兴趣的:(软件绿化之注册DLL)