要使用 . 在 Windows 服务器上注册 DLL 文件regsvr32
,您首先需要将文件移动到您的system32
文件夹,还是在您调用regsvr32
命令后实际上自动完成?
如果我只是将一个dll文件放在我的桌面上并在那里注册,我可以在注册后将其删除吗?删除后会发生什么?
换句话说,regsvr 实际上是如何工作的?
要使用 . 在 Windows 服务器上注册 DLL 文件regsvr32
,您首先需要将文件移动到您的system32
文件夹,还是在您调用regsvr32
命令后实际上自动完成?
如果我只是将一个dll文件放在我的桌面上并在那里注册,我可以在注册后将其删除吗?删除后会发生什么?
换句话说,regsvr 实际上是如何工作的?
RegSvr32 调用 DLL 中的导出方法DllRegisterServer。接下来具体发生的事情取决于实施。通常,COM 的注册表项是根据文件位置编写的。通常,注册不应被视为超出此范围的安装程序。
除非应用程序有特定内容,否则可以从任何地方注册它,但之后您不应移动/删除它。 如果您真的想查看详细信息, SysInternal 的 SysMon可以在您调用注册时监视文件和注册表访问 - 尽管没有什么可以阻止代码不做任何事情或代码可以做的任何事情,例如访问互联网、写入或删除其他文件等等. 像任何可执行文件一样,只注册您信任的代码。
还有可以调用的DllInstall ,根据regsvr32 文档
regsvr32 /i
,它是一个安装程序:还有DllUnregisterServer,但从实际经验来看,它的实现通常比注册质量低。
Windows Installer (MSI) 的目标之一是将安装与这样的代码分离。
除了@Matthew Wetmore 的正确答案之外,通常发生的事情是它在该 dll 中注册了所有 COM 组件。
具体来说,它会在 Windows 注册表中创建两个键(+子键)。
例如考虑一个 dll:
dao360.dll
,它里面有多个 COM 对象。对于每个第一个键是这样的:对于 DAO 表定义对象,键的名称是程序员将在其代码中引用的 COM 对象的 ProgID。
键下通常是具有默认值的单个键:
在这种情况下:
{00000103-0000-0010-8000-00AA006D2EA4}
这是 COM 对象的 Class ID 或 CLSID,它告诉我们第二个键的位置:
此键及其子键和值具有有关 COM 对象的附加信息。
需要注意的一个值是以下默认值:
它具有承载 COM 对象的 exe/dll 的文件路径,在我们的示例中:
%CommonProgramFiles%\Microsoft Shared\DAO\dao360.dll
这是使用 regsvr32.exe 注册此 COM 对象时的正确文件路径。如果您手动移动文件,COM 对象将不再工作,因为此注册表值现在引用了一个丢失的文件。
因此,在 DLL 上使用 regsvr32.exe 之前,请将其移动到其最终位置,并且在注册 DLL 后不要移动它。