4

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

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

但不幸的是,这是不允许的(如备注部分所述),并且函数结果正确地是“找不到文件”。

有没有办法做到这一点?

4

2 回答 2

5

您请求的是PROGRAM FILES 文件夹,而不是SYSTEM文件夹。看看,FOLDERID_SystemFOLDERID_SystemX86不是。

或者,用于FOLDERID_Windows获取 Windows 安装文件夹,然后将特殊SysNative别名附加到其末尾,让文件系统重定向器根据文档为您找到实际文件夹:

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

于 2014-09-18T18:34:40.917 回答
3

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

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

另请注意,实际上不再建议将您自己的文件存储在 System 文件夹中(并且已经有一段时间了),正如文档中的此注释GetSystemDirectory所说:

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

于 2014-09-18T09:46:14.053 回答