64-битная ОС с 32-битным приложением - PullRequest
2 голосов
/ 15 ноября 2011

Я создал приложение, которое отлично работает на 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);
}

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

В 64-битной ОС каталог system32 предназначен для 64-битных процессов, а каталог SysWOW64 - для 32-битных процессов.Прочтите это предложение еще раз, поскольку оно довольно нелогично!

Перенаправитель файловой системы гарантирует, что процесс, пытающийся получить доступ к system32, будет перенаправлен в соответствующий каталог.

Если ваш процесс 32-разрядный, то при записи в system32 перенаправитель приводит к созданию файла / каталога в SysWOW64.

Обновление 1 Очевидно, UAC отключен.В этом случае ваши записи в system32 из 32-битного процесса будут производить вывод под SysWOW64.Вместо того, чтобы проверять, что UAC отключен, вы просто должны добавить опцию requireAdministrator в манифест.

Обновление 2 В комментариях вы заявляете, что хотите изменить фон экрана входа в систему.Для этого вам нужно работать с собственным 64-битным каталогом, поскольку Explorer - это 64-битный процесс на 64-битной ОС.Для этого у вас есть несколько вариантов:

  1. Target AnyCPU, чтобы вы работали как 64-битный процесс под 64-битной ОС.Это, пожалуй, самый простой подход.
  2. Пишите в \ Windows \ sysnative, если вы работаете в 64-битной ОС.Это хитрый способ для 32-битного процесса назвать не говорящую по-другому 64-битную папку system32.
  3. Отключить перенаправитель файловой системы (не рекомендуется).
1 голос
/ 15 ноября 2011

Теперь, когда было предоставлено больше подробностей Второе обновление Дэвида Хеффернана является правильным решением.Я оставлю этот ответ здесь для других людей, которые найдут эту страницу с похожим вопросом, но его совет - то, что вам нужно сделать для этого особого случая.


Оригинальный ответ:

Папка system32 в 64-битной операционной системе Windows предназначена только для 64-битных dll и исполняемых файлов, sysWOW64 - для 32-битных версий.Это сделано для того, чтобы программы не ломались, ожидающие получения 32-битных DLL, и в итоге получат 64-битные DLL.Windows обнаруживает, что 32-разрядная программа пытается выполнить запись или чтение в папку System32, и перенаправляет ее в новую папку.Используйте его как есть, просто имейте в виду, что если кто-то перемещается в проводнике, ему нужно перейти в папку SysWOW64 для доступа к вашим файлам. Вот страница MSDN , посвященная написанию 32-битных приложений в 64-битных окнах.Ключевые части, на которые следует обратить внимание: Redirector для файловой системы и Registry Redirector

Существуют некоторые другие автоматические перенаправления с файлами и ключами реестра, о которых вам следует знать, есливы работаете на современных операционных системах.Это происходит из-за того, что люди, которые писали приложения с предположением, что у них так долго были привилегии администратора, Microsoft не хотела ломать все, когда взламывали кнут с привилегиями учетной записи с помощью Vista и выигрывали 7. См. Этот пост в блоге.

Также, чтобы отвезти домой точку Дэвида Хеффернана.Я бы положил деньги на то, что вы пытаетесь записать в папку System32, не должно идти туда.Пожалуйста, объясните больше, что вы пытаетесь сделать с этой папкой?Если вы просто хотите получить локальные данные компьютера, вы должны использовать Environment.GetFolderPath

string pathToMyDataFolder = Environment.GetFolderPath(Path.Combine(Environment.SpecialFolder.CommonApplicationData, MyAppFolderName));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...