如何为64位和32位客户端注册64位进程外COM组件?

时间:2014-05-14 11:59:28

标签: delphi com 64-bit

我有一个Delphi XE4应用程序,它可以作为进程外COM组件。 该应用程序有时在同一台计算机上以32位应用程序启动,有时也作为64位应用程序启动。

当前运行的实例应该充当32位COM客户端的进程外服务器。应用程序在启动期间将[1]本身注册为“每用户”COM组件。之后,32位COM客户端可以连接到正在运行的实例。

  • 这适用于32位版本的应用程序。

  • 只要注册了64位版本,这对64位版本也可以正常工作[2]。

  • 如果32位版本也已注册,那么这对64位版本不再起作用[3]。在这种情况下,COM客户端总是尝试启动32位应用程序,而不是使用正在运行的64位实例。

有没有办法让64位Delphi应用程序为64位和32位客户端注册自己?

(直接编辑注册表似乎并不是一个好主意,但我想最后64位应用程序应该从Wow6432Node分支中删除32位版本,或者应该在那里替换它。)

备注

[1] =应用程序在启动期间用于注册自身的代码:

ComServer.PerUserRegistration := True;
ComServer.UpdateRegistry(True);
ComServer.Initialize;

[2]只有64位注册= 64位exe的路径可以在HKCR / CLSID / {...} / LocalServer32下找到,并且在HKCR / Wow6432Node下没有任何或不存在的路径 / CLSID /{...}/ LocalServer32

[3] 32位注册= 32位exe的路径可以在HKCR / Wow6432Node / CLSID / {...}} / LocalServer32

下找到

2 个答案:

答案 0 :(得分:0)

首先,我应该说,我仍然不相信让你的COM服务器注册自己的智慧,而不是让安装程序这样做。但是,您已明确表示这是您的目标,所以让我们继续在此基础上继续。

在我看来,好像您希望正在运行的应用程序写入注册表的32位和64位视图。我个人会直接在那里写。使用KEY_WOW64_32KEYKEY_WOW64_64KEY标志来访问注册表的32位和64位视图。

在评论和聊天中,您表明您认为直接注册表写入是黑客行为。但这是正式记录的注册COM服务器的方法。这当然是UpdateRegistry所做的全部。由于您有UpdateRegistry未处理的特殊要求,因此无法找到更好的方法来实现目标。

答案 1 :(得分:-1)

这个MSDN article about the CLSCTX enumeration描述了两个值(CLSCTX_ACTIVATE_32_BIT_SERVER和CLSCTX_ACTIVATE_64_BIT_SERVER),COM客户端可以用它来表示它对COM服务器体系结构的偏好。

我可以让客户端表达对它想要的版本的偏好,以便Windows使用正在运行的版本,而不是将我的应用程序的运行实例注册为32位和64位COM服务器。只有在以下条件下才有可能:

  • 可以修改COM客户端,
  • COM客户端可以检测当前正在运行的进程外COM应用程序的版本(32位或64位)。

顺便说一下,MSDN文章很好地解释了哪个版本的Windows更喜欢哪个版本的进程外COM组件(从Windows Server 2003 SP1开始,32位客户端更喜欢32位COM服务器)。