Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有32位应用程序的64位操作系统_C#_Windows_Windows 7 - Fatal编程技术网

C# 带有32位应用程序的64位操作系统

C# 带有32位应用程序的64位操作系统,c#,windows,windows-7,C#,Windows,Windows 7,我创建了一个在32位操作系统上运行的应用程序,但我尝试过的每一个64位操作系统似乎都不起作用 我正在创建一个应用程序,允许您在Windows7中更改登录屏幕的背景图像。要实现这一点,我的应用程序需要在System32目录中创建一个文件夹,而在64位操作系统上,它似乎不想创建它。我没有得到错误,也没有抛出异常。它似乎无法创建文件夹 64位操作系统有一个不同的System32文件夹“Windows\SysWOW64\”,所以我应该改为写入该文件夹吗?我有点困惑64位操作系统在做什么,所以如果有人能澄

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


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

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

提前谢谢

创建目录的代码:

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

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

现在提供了更多的细节,这才是正确的解决方案。我将把这个答案留在这里,让其他人在这一页找到类似的问题,但他的建议是你需要做的这个特殊情况


原始答案:

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

如果您使用的是现代操作系统,那么您应该注意使用文件和注册表项的其他一些自动重定向。之所以会出现这种情况,是因为人们在编写应用程序时一直假设自己拥有管理员权限,而微软不想在vista和win 7的帐户权限下破釜沉舟

也让大卫·赫弗南的观点得到了印证。我会把钱放在任何你想写的东西上。32文件夹不应该放在那里。请详细解释您试图对该文件夹执行的操作?如果您只是想要机器本地数据,您应该使用


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

确保尝试访问system32的进程重定向到适当的目录

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

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

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

  • 以任何CPU为目标,以便在64位操作系统下作为64位进程运行。这显然是最简单的方法
  • 如果在64位操作系统上运行,请写入\Windows\sysnative。对于32位进程来说,这是一种秘密的方式来命名不可说出的64位system32文件夹
  • 禁用文件系统重定向器(不建议使用)

  • 您确定您的应用程序正在以适当的权限运行吗?System32将成为一个受保护的目录。你能告诉我们你使用的代码吗?是的,我是以管理员帐户运行的。在程序开始时,我检查用户是否是管理员。对于所有像我一样对此感到困惑的人,我认为milkboat正在尝试编写一个应用程序来管理%windir%\system32\oobe\info文件夹中的图像。@milkboat一个小小的切题说明,您找到windows文件夹的方式很糟糕,用户可以将windows安装到您想要的任何文件夹,使用
    环境.GetFolderPath(SpecialFolder.windows)
    ,它将始终指向当前计算机上运行的windows的安装目录。但按原样使用程序是行不通的。它不会在目录中创建文件夹。我是否应该检查操作系统是否为64位,然后写入SysWOW64文件夹?否!阅读有关文件系统重定向程序的信息。system32的32位进程访问被重定向到SysWOW64。我测试过的所有机器上都安装了Windows 7。我还检查了UAC是否被禁用。我不得不问,为什么要在system32中创建文件夹。这违反了所有已知的合理实践准则。我正在创建一个应用程序,允许您在Windows7中更改登录屏幕的背景图像。要做到这一点,你需要创建一个特定的目录,并将一个映像移到那里。我的最新更新现在已经介绍了这一点。问题中缺少的信息是您在上面的评论中所包含的内容,即您在使用64位本机system32。
    string pathToMyDataFolder = Environment.GetFolderPath(Path.Combine(Environment.SpecialFolder.CommonApplicationData, MyAppFolderName));