如何在32位应用程序中获取64位系统文件夹?

5
在32位应用程序中,我必须将文件复制到64位系统文件夹(C:\Windows\System32\而不是C:\Windows\SysWOW64\)。
为此,我尝试使用WinAPI函数SHGetKnownFolderPath获取文件夹,并使用参数FOLDERID_ProgramFilesX64(GUID:6D809377-6AF0-444b-8957-A3773F02200E)。
但不幸的是,这是不允许的(如备注部分所述),函数返回正确的结果为“找不到文件”。
有没有办法完成这个任务?

最好让你的32位程序启动一个单独的64位程序来复制文件。请参阅http://blogs.msdn.com/b/oldnewthing/archive/2008/12/22/9244582.aspx。 - Jim Mischel
通过避免问题来解决它。当你遵守规则并且不修改系统目录时,问题就会消失。 - David Heffernan
@DavidHeffernan:我的工作是将DLL安装到系统的32位和64位版本中... - joe
除非你是微软Windows团队的成员,否则在系统目录上安装软件是违反平台规则的。显然,你可以选择无视这些规定,但我只是想让你知道这是违反规则的行为。 - David Heffernan
好的,我漏掉了什么。当我需要安装一个常用的DLL(非程序集)时,有哪些规则? - joe
2个回答

7
您正在请求 PROGRAM FILES 文件夹,而不是 SYSTEM 文件夹。请查看 FOLDERID_SystemFOLDERID_SystemX86
或者,使用 FOLDERID_Windows 来获取 Windows 安装文件夹,然后将特殊的 SysNative 别名附加到末尾,让文件系统重定向器为您定位实际的文件夹,参考文档

32 位应用程序可以通过将 %windir%\Sysnative 替换为 %windir%\System32 来访问本机系统目录。WOW64 识别 Sysnative 作为特殊别名,用于指示文件系统不应重定向访问。该机制灵活易用,因此它是推荐的绕过文件系统重定向的机制。请注意,64 位应用程序无法使用 Sysnative 别名,因为它是一个虚拟目录而不是真实的目录。


4
我不明白为什么你要尝试使用FOLDERID_ProgramFilesX64,因为如果它起作用的话,它会给你Program Files文件夹而不是你想要的System32文件夹。对于System32文件夹,你需要使用GetSystemDirectory函数。
你可以使用名称很抓耳的Wow64DisableWow64FsRedirection函数来禁用WOW64重定向,这样你的32位应用程序就可以访问64位系统文件夹。然后使用Wow64RevertWow64FsRedirection在完成后恢复重定向。
此外,请注意,自从很久以前,不再建议将文件存储在系统文件夹中(并且已经很长时间了),因为GetSystemDirectory文档中的说明如下:

应用程序不应在系统目录中创建文件。如果用户正在运行共享版本的操作系统,则应用程序无写入系统目录的权限。


该应用程序帮助安装DLL的32位和64位变体。因此,我需要明确两个系统文件夹。 - joe
对于32位应用程序,32位和64位系统文件夹的路径都是(例如)C:\ Windows \ System32 - 它是Wow64文件系统重定向确定您最终访问哪个文件夹。 - Jonathan Potter
那么,切换文件系统重定向开关是唯一的方法来定位正确的文件夹 - 这就是你告诉我的吗? - joe
这不是唯一的目标方式,但我认为除了假设它被称为SysWOW64并且是System32的同级文件夹之外,实际上没有办法获取到32位文件夹的路径。而使用重定向技巧,您无需担心它实际位于何处。 - Jonathan Potter
好的,我明白了。这假设我的应用程序是32位的。最好的情况是确保它针对System32和SysWOW64,无论我的应用程序是32位还是64位。如果我有一个64位的应用程序,那么我可以使用FOLDERID_???。 - joe
2
为什么你不应该使用 Wow64DisableWow64FsRedirection 来解决本地问题,以及你应该使用什么替代方法:http://blogs.msdn.com/b/oldnewthing/archive/2013/03/21/10404021.aspx - GSerg

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