如何阻止Delphi 6 COM服务器应用程序在启动时重新向COM注册

4
我有一组旧的Delphi 6应用程序,它们是独立的COM服务器。在Windows上尝试以普通域用户身份运行这些程序时,我发现它们在启动时(没有任何命令行参数或开关)试图更新HKEY_CURRENT_CLASSES的块。由于缺乏对HKCR子项的权限,这将导致失败。似乎运行Delphi 6 COM服务器会导致它尝试使用系统注册表来注册其嵌入式COM类型。
通常情况下,我不希望出现这种情况。我们会在管理员帐户下进行一次安装以初始化COM注册表,但不希望在非管理员帐户的正常运行条件下执行此操作。(如果您使用Sysinternals进程监视器监视系统,则可以看到注册表键访问尝试失败。)
是否有命令行开关可以传递给Delphi 6 COM服务器以防止自动执行COM注册逻辑?
2个回答

4
我认为你并没有看到你所想象的东西...
Delphi只会在COM服务器未被安装时尝试安装它们。我猜测你所看到的是你的应用程序检查它是否已经注册。你看到失败的原因是因为在Delphi 6中,注册表键将使用ALL_ACCESS权限打开(D6之前是XP/Vista/Win7),我认为这就是导致你的注册表访问尝试失败的原因。
回答你的问题:没有命令行开关可以阻止自动注册逻辑。

如果Ken是正确的,那么您可以安全地忽略这些失败的读取。 - David Heffernan
2
Delphi 6 默认情况下会在每次运行可执行文件时尝试注册 COM 服务器(我刚刚检查了 Delphi 7 的源代码)。你必须修改 ComServ 单元以禁用它,在 TComServer.Initialize 方法中,就像 Mikael Eriksson 所说的那样。自至少 Delphi 2007 以来,这个问题已经得到解决。 - Ondrej Kelle

4
除非启动参数是 /UNREGSERVER,否则它将始终尝试从 TComServer.Initialize 注册服务器,这会导致注册表设置被删除。如果启动参数是 /REGSERVER,如果注册失败,则会引发异常,否则它只会忽略异常。在 Delphi 的较新版本中已经删除了自动注册 out-proc COM 服务器的选项。在 Delphi 6 中取消此行为的唯一选项是修改 TComServer.Inititalize,仅在 FStartMode 为 smRegServer 或 smUnregServer 时才注册服务器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接