Подтвердить что ты не робот

Получение каталога syswow64 с использованием 32-разрядного приложения

Я пытаюсь найти файл внутри системного каталога. Проблема в том, что при использовании

Environment.SystemDirectory

На машине x64 я все равно получаю каталог System32, а не каталог Systemwow64.

Мне нужно получить каталог "System32" на машинах x86, а каталог "SystemWow64" на x64

Любые идеи?

EDIT: Чтобы найти SysWow64, я использую "GetSystemWow64Directory". (более подробная информация здесь: pinvoke Обратите внимание, что на компьютерах, отличных от x64, результат равен "0". Надеюсь, что это поможет кому-то.

4b9b3361

Ответ 1

Использование функции SHGetSpecialFolderPath:

[DllImport("shell32.dll")]
public static extern bool SHGetSpecialFolderPath(IntPtr hwndOwner, [Out]StringBuilder lpszPath, int nFolder, bool fCreate);

string GetSystemDirectory()
{
    StringBuilder path = new StringBuilder(260);
    SHGetSpecialFolderPath(IntPtr.Zero,path,0x0029,false);
    return path.ToString()
}

Вернет System32 на x86 и SysWow64 на x64

Ответ 2

Используйте Environment.GetFolderPath(Environment.SpecialFolder.SystemX86) вместо этого.

Ответ 3

Что думает ваша 32-разрядная программа System32 - это действительно SysWOW64 - не кодируйте 32-разрядные приложения, чтобы иметь явное знание 64-разрядной версии, что переадресация WOW64 для

Ответ 4

У меня была та же проблема. Решения заключаются в том, чтобы установить "Цель платформы" как x86 вместо AnyCPU или x64 в свойствах проекта в Visual Studio. В этом случае путь будет "C:\Windows\system32", но он фактически перенаправляется на "C:\Windows\SysWOW64". Вы можете проверить это, поместив любой файл в папку "C:\Windows\SysWOW64", а затем используйте команду File.Exists, чтобы проверить, найден ли файл в этой папке:

File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), sFileName));

или

File.Exists(Path.Combine(Environment.SystemDirectory, sFileName));

enter image description here