要使用regsvr32在Windows服务器上注册DLL文件,首先需要将文件移动到system32文件夹,还是在调用regsvr32命令后自动实现?
如果我只是放在我的桌面上的dll文件,并在那里注册,我可以在注册后删除它吗? 删除后会发生什么?
换句话说,regsvr实际上是如何工作的?
除了@Matthew Wetmore的正确答案之外,通常情况下,它会注册该DLL中的所有COM组件。
具体来说,它在Windowsregistry中创build两个键(+子键)。
例如,考虑一个dll: dao360.dll ,里面有多个COM对象。 对于每个第一个键是这样的:
HKLM \ SOFTWARE \ Classes下\ DAO.TableDef.36
对于DAO表定义对象,键的名称是程序员在其代码中引用的COM对象的ProgID。
在关键之下通常是一个具有默认值的单个键:
HKLM \ SOFTWARE \ Classes下\ DAO.TableDef.36 \ CLSID
在这种情况下:
{00000103-0000-0010-8000-00AA006D2EA4}
这是COM对象的Class ID或CLSID,它告诉我们第二个键的位置:
HKLM \ SOFTWARE \ Classes下\ CLSID {} 00000103-0000-0010-8000-00AA006D2EA4
此键与其子项和值有关于COM对象的其他信息。
要注意的一个值是下面的默认值:
HKLM \ SOFTWARE \ Classes下\ Wow6432Node \ CLSID {00000103-0000-0010-8000-00AA006D2EA4} \ InprocServer32的
它具有承载COM对象的exe / dll的文件path,在我们的示例中:
%CommonProgramFiles%\Microsoft Shared\DAO\dao360.dll
当使用regsvr32.exe注册此COM对象时,这是正确的文件path。 如果您手动移动文件,COM对象将不再工作,因为此registry值现在引用缺less的文件。
因此,在DLL上使用regsvr32.exe之前,请将其移至其最终位置,并且在注册DLL之后不要移动该DLL。
RegSvr32调用DLL中的导出方法DllRegisterServer 。 接下来具体发生的是实施。 COM的registry键通常是基于文件位置写入的。 一般来说,注册不应该被认为是超出这个范围的安装者。
除非有特定的应用程序,它可以在任何地方注册,但不应该移动/删除它。 SysInternal的SysMon可以观看文件和registry的访问,当你打电话注册,如果你真的想看到的细节 – 虽然没有任何东西阻止代码做任何事情或任何代码可以做像访问互联网,写或删除其他文件,等等。 像任何可执行文件一样,只有注册码可信。
还有一个DllInstall可以用regsvr32 /i调用,根据regsvr32文档 ,它是一个安装程序:
REGSVR32
此命令行工具将.dll文件注册为registry中的命令组件。
句法
regsvr32 [/ u] [/ s] [/ n] [/ i [:cmdline]] dllname
参数
/ u :取消注册服务器。
/ s :指定regsvr32以静默方式运行,不显示任何消息框。
/ n :指定不要调用DllRegisterServer。 您必须在/ i中使用此选项。
/我:cmdline :调用DllInstall传递一个可选的[cmdline]。 与/ u一起使用时,会调用dll卸载。
dllname :指定将被注册的dll文件的名称。
/? :在命令提示符下显示帮助。
也有DllUnregisterServer ,但是从实践经验来看,这个实现通常比注册质量要低。
Windows Installer(MSI)的目标之一就是将安装与代码分离。