【问题标题】:64bit OS with a 32bit application带有 32 位应用程序的 64 位操作系统
【发布时间】:2011-11-15 19:07:50
【问题描述】:

我创建了一个可以在 32 位操作系统上运行的应用程序,但我尝试过的每个 64 位操作系统似乎都不起作用。

我正在创建一个应用程序,允许您更改 Windows 7 中登录屏幕的背景图像。为此,我的应用程序需要在 System32 目录中创建一个文件夹,而在 64 位操作系统上似乎没有想要创建它。我没有收到错误,也没有抛出异常。它似乎没有创建文件夹。

64 位操作系统有一个不同的 System32 文件夹“Windows\SysWOW64\”,所以我应该改写它吗?我对 64 位操作系统在做什么有点困惑,所以如果有人能澄清它并指出我正确的方向,那就太好了。

提前致谢!

目录制作代码:

path = DriveLabel += @"Windows\System32\Oobe\info\backgrounds\";

if (!Directory.Exists(path))
{
     Directory.CreateDirectory(path);
}

【问题讨论】:

  • 您确定您的应用程序正在以适当的权限运行吗? System32 将成为受保护的目录。
  • 你能告诉我们你使用的代码吗?
  • 是的,我使用管理员帐户运行。在程序开始时,我会检查用户是否是管理员。
  • 对于和我一样困惑的每个人,read this article,我认为牛奶船正在尝试编写一个应用程序来管理 %windir%\system32 中的图像\oobe\info 文件夹。
  • @Milkboat 一个小切线说明,您找到 windows 文件夹的方式很糟糕,用户可以将 windows 安装到您想要的任何文件夹,使用 Environment.GetFolderPath(SpecialFolder.Windows) 它将始终指向安装目录当前机器上运行的窗口个数。

标签: c# windows windows-7


【解决方案1】:

在 64 位操作系统上,system32 目录用于 64 位进程,而 SysWOW64 目录用于 32 位进程。再读一遍那句话,因为它相当违反直觉!

File System Redirector 确保尝试访问 system32 的进程被重定向到适当的目录。

如果您的进程是 32 位的,那么当它写入 system32 时,重定向器会导致在 SysWOW64 下创建文件/目录。

更新 1 显然 UAC 已禁用。在这种情况下,您从 32 位进程对 system32 的写入将在 SysWOW64 下产生输出。与其检查 UAC 是否被禁用,不如将 requireAdministrator 选项添加到清单中。

更新 2 在 cmets 中,您声明要更改登录屏幕的背景。为此,您需要使用本机 64 位目录,因为 Explorer 是 64 位操作系统上的 64 位进程。您有多种选择来实现这一目标:

  1. 以 AnyCPU 为目标,以便在 64 位操作系统下作为 64 位进程运行。这是最简单的方法。
  2. 如果您发现自己在 64 位操作系统上运行,请写入 \Windows\sysnative。这是 32 位进程命名原本无法描述的 64 位 system32 文件夹的偷偷摸摸的方式。
  3. 禁用文件系统重定向器(不推荐)。

【讨论】:

  • Windows 7 安装在我测试过的所有机器上。我还检查了 UAC 是否被禁用。
  • 我不得不问,你为什么要在system32中创建文件夹。这违反了所有已知的合理实践准则。
  • 我正在创建一个应用程序,允许您更改 Windows 7 中登录屏幕的背景图像。为此,您需要创建一个特定目录并将图像移动到那里。
  • 我的最新更新现在涵盖了这一点。问题中缺少的信息是您上面的评论中包含的内容,即您使用的是 64 位本机系统32。
【解决方案2】:

现在提供了更多详细信息,David Heffernan's 2nd update 是正确的解决方案。我会将这个答案留给其他找到此页面并有类似问题的人,但他的建议是您需要针对这个特定案例做些什么。


原答案:

64 位 Windows 操作系统上的 system32 文件夹仅用于 64 位 dll 和可执行文件,sysWOW64 用于 32 位版本。这样做是为了不破坏那些期望获得 32 位 dll 并最终获得 64 位 dll 的程序。 Windows 检测到 32 位程序正在尝试写入或读取 System32 文件夹并将其重定向到新文件夹。继续按原样使用它,请注意,如果有人在资源管理器中导航,他们需要转到 SysWOW64 文件夹才能访问您的文件。 Here is a MSDN page 在 64 位窗口上编写 32 位应用程序。要查看的关键部分是File System RedirectorRegistry Redirector

如果您使用的是现代操作系统,则应该注意其他一些带有文件和注册表项的自动重定向。发生这种情况是因为人们在编写应用程序时一直假设他们拥有管理员权限,微软不想在他们以 vista 的帐户权限和 win 7 破解鞭子时破坏一切。See this blog post.

也将大卫赫弗南的观点带回家。我会把钱放在你试图写入 System32 文件夹的任何东西上,不应该去那里。请解释更多您要对该文件夹执行的操作?如果你只是想要机器本地数据,你应该使用Environment.GetFolderPath

string pathToMyDataFolder = Environment.GetFolderPath(Path.Combine(Environment.SpecialFolder.CommonApplicationData, MyAppFolderName));

【讨论】:

  • 但是按原样使用该程序是行不通的。它不会在目录中创建文件夹。我是否应该检查操作系统是否为 64 位,然后写入 SysWOW64 文件夹?
  • 不!阅读有关文件系统重定向器的信息。 system32的32位进程访问被重定向到SysWOW64。
猜你喜欢
  • 2012-09-01
  • 2011-07-07
  • 1970-01-01
  • 2015-09-26
  • 2017-07-17
  • 2012-11-17
  • 2013-08-29
  • 2011-07-06
  • 1970-01-01
相关资源
最近更新 更多