有些程序集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\AppID\
写过程序的人都知道GUID在DLL中,不是在注册时生成的,也就是说对于某一个固定的DLL,只要不重新生成DLL,GUID是不会改变的,不管注册多少次。当然如果重新编译生成了DLL就有可能改变了。
通过试验,明白了,通过regsvr32注册DLL就是向注册表中HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\下写了注册表,关键是下边添加了InprocServer32项
并没有向系统文件下复制文件,GUID是保存在DLL中的,而不是注册时才生成的。
另外需要注册的DLL其实就是com,使用一些函数到处工具会发现 , 都可以导出如下4个函数 llCanUnloadNow,DllGetClassObject,DllRegisterServer,DllUnregisterServer
在注册表中的HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\下有相应的注册信息,关键是包含一个HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\DLLGUID\InprocServer32
注意:主要注册的DLL,并不一定是以DLL为后缀的,也有可能使用其他的后缀,例如ocx就是一种很常见的需要注册的DLL,从正式的角度讲需要注册的DLL都是COM,具体可以查询COM相关资料。