对于COM服务器和registry项redirect,是否需要执行文件pathredirect转换?

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

当我正在做一些与COM服务器和registryredirect相关的事情时,我遇到了一些问题,不太清楚我的理解是否正确。 希望任何人都可以分享一些光。 提前致谢。

基本上一个COM服务器已经注册在registry中,任何人都可以使用它的服务。 在64位Windows操作系统上,registry中可能有两个可能的视图,一个是默认的,另一个是WOW64视图。 例如,第一个registry项是: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/桌面/ aa384129(v = vs.85).aspx )来访问其他备用registry项。

我需要的是,我想通过读取registry项来获取LocalServer32可执行文件,这可以工作。 问题是,对于我读回的可执行文件path,是否需要执行文件path转换(以便获取正确的值),具体取决于从哪个视图获取值? 例如,如果从COMPUTER \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Classes \ CLSID {GUID} \ LocalServer32获取文件path,文件path是:C:\ Windows \ System32 \ abc.exe,是否需要转换path到:C:\ Windows \ SysWow64 \ abc.exe? 或者我需要将C:\ Program Files \ abc.exe转换为C:\ Program Files(x86).exe?

另一个问题是,如果对于COM的某些registry项,两个视图中设置的值是不同的(例如,一个具有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来确定这个逻辑? 使用第一个,如果它存在,否则使用第二个?

非常感谢。

Windows的64位版本已经具备了所有功能,使您无需自己照顾它。 排除故障时,您只需要牢记规则。

首先是注册表重定向程序,它可以确保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 files到c:\ program files(x86)。 非常类似的,一个32位的安装程序不需要知道这个bean,它可以简单地使用传统的32位路径名。 对于任何32位客户端程序都是一样的,它将以同样的方式重定向。 所有你关心的是知道在哪里寻找一个文件来验证安装程序。

如果位混合,64位程序读取注册表项或由32位程序安装的文件,则只能出错。 或者相反。 就像您的故障排除工具一样,如Explorer,Regedit和SysInternals的Process Monitor。 一般来说,在COM中应该强烈避免的是,大多数服务器是在进程中的服务器,并且在64位进程中运行32位代码是不可能的。 注册表和文件重定向器存在的最大原因。