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

时间:2014-09-18 08:43:40

标签: windows winapi 32bit-64bit special-folders known-folders

在32位应用程序中,我必须将文件复制到64位系统文件夹
C:\Windows\System32\代替C:\Windows\SysWOW64\

为此,我尝试使用带参数SHGetKnownFolderPath的WinAPI函数FOLDERID_ProgramFilesX64获取文件夹(GUID:6D809377-6AF0-444b-8957-A3773F02200E)。

但不幸的是,这是不允许的(如备注部分所述),并且正确的功能结果是找不到文件'。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:4)

您正在请求 PROGRAM FILES 文件夹,而不是 SYSTEM 文件夹。请改为FOLDERID_SystemFOLDERID_SystemX86

或者,使用FOLDERID_Windows获取Windows安装文件夹,然后将特殊的SysNative别名附加到其末尾,让文件系统重定向器为您找到实际的文件夹,按照{ {3}}:

  

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

答案 1 :(得分:2)

我很困惑为什么当你说你想要System32文件夹时你会尝试FOLDERID_ProgramFilesX64,因为前者会(如果有效)给你 Program Files 文件夹。对于 System32 文件夹,您需要GetSystemDirectory功能。

您可以使用引人注目的Wow64DisableWow64FsRedirection函数来禁用WOW64重定向,这允许您的32位应用程序实际访问64位系统文件夹。然后使用Wow64RevertWow64FsRedirection在完成后恢复重定向。

另请注意,实际上并不建议将您自己的文件存储在System文件夹中(并且已经很长时间了),正如GetSystemDirectory文档中的这条说明所示:

  

应用程序不应在系统目录中创建文件。如果   用户正在运行操作系统的共享版本   应用程序没有对系统目录的写访问权。