64位操作系统和32位应用程序

本文关键字:应用程序 32位 操作系统 64位 | 更新日期: 2023-09-27 18:14:37

我创建了一个在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);
}

64位操作系统和32位应用程序

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

文件系统重定向确保试图访问system32的进程被重定向到适当的目录。

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

Update 1显然UAC被禁用。在这种情况下,从32位进程写入system32将在SysWOW64下产生输出。而不是检查UAC被禁用,你应该只添加requireAdministrator选项到你的清单。

Update 2在评论中你声明你想改变登录屏幕的背景。为了做到这一点,您需要使用本机64位目录,因为Explorer是64位操作系统上的64位进程。您有许多选项可以实现这一点:

  1. 目标AnyCPU,使您在64位操作系统下作为64位进程运行。这是最简单的方法。
  2. 如果您发现自己在64位操作系统上运行,则写入'Windows' sysative。这是一个32位进程为64位system32文件夹命名的鬼鬼祟祟的方式。
  3. 禁用文件系统重定向(不推荐)。

现在有更多的细节提供了David Heffernan的第二次更新是正确的解决方案。我将把这个答案留给其他找到这个页面的人,他们有类似的问题,但他的建议是你需要为这个特定的情况做些什么。


原始答:

64位windows操作系统上的system32文件夹只用于64位的dll和可执行文件,sysWOW64用于32位版本。这样做是为了使程序不会中断,期望得到32位的dll,最终将被给予64位的dll。Windows检测到一个32位程序正在尝试写入或读取System32文件夹,并将其重定向到新文件夹。继续按原样使用它,只是要注意,如果有人在资源管理器中导航,他们需要转到SysWOW64文件夹来访问您的文件。这是一个MSDN页面,介绍在64位窗口上编写32位应用程序。关键的部分是文件系统重定向器和注册表重定向器

如果你使用的是现代操作系统,那么你应该注意其他一些带有文件和注册表项的自动重定向。之所以会出现这种情况,是因为人们在编写应用程序时一直假设自己拥有管理员权限,而微软并不想在vista和win7的账户权限问题上大开眼界。请看这篇博文。

也是为了说明David Heffernan的观点。我打赌不管你想写什么都不应该写到System32文件夹里。请详细解释一下您要对该文件夹做什么?如果您只想要机器本地数据,则应该使用Environment。GetFolderPath

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