3

如果标题不是那么准确,请原谅我。

当我在做与 COM 服务器和注册表重定向相关的事情时遇到了一些问题,我不太确定我的理解是否正确。希望任何人都可以分享一些关于它的信息。提前致谢。

基本上,在任何人都可以使用它的服务之前,一个 COM 服务器已经在注册表中注册了。在 64 位 Windows 操作系统上,注册表中可能有 2 个可能的视图,一个是默认视图,另一个是 WOW64 视图。例如,第一个注册表项是:COMPUTER\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID{GUID}\LocalServer32,另一个是:COMPUTER\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID{GUID}\LocalServer32。并且取决于默认情况下可以读取任何一个的进程位数(64位与32位),我们也可以使用KEY_WOW64_64KEY或KEY_WOW64_32KEY(如:http: //msdn.microsoft.com/en-us/library/windows/ desktop/aa384129(v=vs.85).aspx ) 以访问其他替代注册表项。

我需要的是,我想通过读取注册表项来获取 LocalServer32 可执行文件,这可以工作。问题是,对于我读回的可执行文件路径,我是否需要根据我从哪个视图获取值来进行文件路径转换(以获得正确的值)?例如,如果文件路径是从 COMPUTER\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID{GUID}\LocalServer32 获取的,文件路径是:C:\Windows\System32\abc.exe,是否需要翻译路径到:C:\Windows\SysWow64\abc.exe?还是我需要将 C:\Program Files\abc.exe 翻译成 C:\Program Files(x86).exe?

另一个问题是,如果对于 COM 的某些注册表项,在两个视图中设置的值不同(例如,一个具有 C:\Program Files\abc.exe,另一个具有 C:\Program Files(x86) \abc.exe),那么当COM服务器启动时,svchost.exe怎么知道启动哪个,C:\Program Files\abc.exe还是C:\Program Files(x86)\abc.exe?有谁知道 svchost.exe 确定这一点的逻辑?如果存在则使用第一个,否则使用第二个?

非常感谢。

4

1 回答 1

3

64 位版本的 Windows 已经具备所有功能,无需您自己处理。解决问题时,您只需要牢记规则。

首先是注册表重定向器,它确保 32 位客户端程序不会意外读取包含仅适用于 64 位程序的配置信息的键。您已经知道了,大部分 HKLM\Software 注册表访问都重定向到 HKLM\Software\Wow6432Node。注册 COM 服务器时,此重定向已经到位,32 位安装程序会自动重定向以将密钥写入 Wow6432Node。安装程序完全不知道 Wow6432Node 甚至存在。一切都自动组合在一起,安装程序被重定向,COM 服务器客户端也被重定向。您所关心的只是知道在哪里查看以验证安装是否正确完成,您必须使用 Regedit.exe 查看 HKLM\Software\Wow6432Node\Classes\CLSID 以找到密钥。

文件重定向的工作方式大致相同,对 c:\windows\system32 的任何访问都会重定向到 c:\windows\syswow64,从 c:\program 文件到 c:\program 文件 (x86)。非常相似,32 位安装程序不需要知道 bean,它可以简单地使用传统的 32 位路径名。对于任何 32 位客户端程序都是如此,它将以相同的方式重定向。您所关心的只是知道在哪里查找文件以验证安装程序。

只有当位数混合时才会出错,64 位程序读取注册表项或 32 位程序安装的文件。或者反过来。就像您的故障排除工具一样,例如 Explorer、Regedit 和 SysInternals 的 Process Monitor。一般来说,在 COM 中应该强烈避免的事情是,大多数服务器都是进程内服务器,在 64 位进程中运行 32 位代码是不可能的。注册表和文件重定向器首先存在的最大原因。

于 2014-03-04T09:53:44.913 回答