在32位应用程序中,我必须将文件复制到64位系统文件夹
(C:WindowsSystem32
而非C:WindowsSysWOW64
)
为此,我尝试使用WinAPI函数SHGetKnownFolderPath
和参数FOLDERID_ProgramFilesX64(GUID:6D809377-6AF0-444b-8957-A777F02200E)来获取文件夹。
但不幸的是,这是不允许的(如备注部分所述),函数结果正确地为"找不到文件"。
有办法做到这一点吗
您请求的是PROGRAM FILES文件夹,而不是SYSTEM。请看FOLDERID_System
和FOLDERID_SystemX86
。
或者,使用FOLDERID_Windows
获取Windows安装文件夹,然后在其末尾附加特殊的SysNative
别名,让文件系统重定向器根据文档为您定位实际文件夹:
32位应用程序可以访问本机系统目录,方法是用%windir%\Sysnative替换%windir\\System32WOW64将Sysnative识别为一个特殊别名,用于指示文件系统不应重定向访问此机制灵活且易于使用,因此建议使用此机制绕过文件系统重定向请注意,64位应用程序不能使用Sysnative别名,因为它是一个虚拟目录,而不是真实目录。
我很困惑,当你说你想要System32文件夹时,为什么你会尝试FOLDERID_ProgramFilesX64
,因为前者会(如果有效的话)给你程序文件文件夹。对于System32文件夹,您需要GetSystemDirectory
函数。
您可以使用名称醒目的Wow64DisableWow64FsRedirection
函数来禁用WOW64重定向,这允许您的32位应用程序实际访问64位系统文件夹。完成后,使用Wow64RevertWow64FsRedirection
恢复重定向。
还要注意的是,实际上不建议再将自己的文件存储在System文件夹中(而且已经有很长一段时间没有了),正如GetSystemDirectory
文档中的注释所说:
应用程序不应在系统目录中创建文件。如果用户正在运行共享版本的操作系统应用程序没有对系统目录的写访问权限。