Как определить разрядность .EXE или .DLL?
Как определить тип процессора для которого скомпилирован бинарный файл? Можно воспользоваться сборщиком из поставки Visual Studio 2005:
link.exe /dump /headers

На самом деле “link.exe /dump” это просто обертка для утилиты dumpbin.exe. Сравните:
dumpbin.exe /headers

Кроме того, существует утилита filever.exe, к достоинствам которой можно отнести значительно более компактный вывод на экран:
Как проверить разрядность системы?
@VladD, я подумал, возможно автору принципиально использовать вызовы WinAPI для этой задачи. Но ок, сейчас перенесу.
19 апр 2017 в 21:48
Хорошо Сделаем как ответ)
19 апр 2017 в 21:51
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Начиная с 4 версии фреймворка существует простой способ проверить разрядность ОС, используя статический класс Environment и его свойство Is64BitOperatingSystem :
using System; static string GetOSBit()
Отслеживать
ответ дан 19 апр 2017 в 21:57
1,980 1 1 золотой знак 15 15 серебряных знаков 26 26 бронзовых знаков
Решил проблему так:
internal class OSCheckBit < private static bool Is32BitProcessOn64BitProcessor() < IsWow64ProcessDelegate fnDelegate = GetIsWow64ProcessDelegate(); if (fnDelegate == null) return false; bool isWow64; bool retVal = fnDelegate.Invoke(Process.GetCurrentProcess().Handle, out isWow64); if (retVal == false) return false; return isWow64; >private static IsWow64ProcessDelegate GetIsWow64ProcessDelegate() < IntPtr handle = LoadLibrary("kernel32"); if (handle != IntPtr.Zero) < IntPtr fnPtr = GetProcAddress(handle, "IsWow64Process"); if (fnPtr != IntPtr.Zero) return (IsWow64ProcessDelegate)Marshal.GetDelegateForFunctionPointer((IntPtr)fnPtr, typeof(IsWow64ProcessDelegate)); >return null; > public enum SoftwareArchitecture < Unknown = 0, x32 = 1, x64 = 2 >static public SoftwareArchitecture OSBits < get < SoftwareArchitecture osbits = SoftwareArchitecture.Unknown; switch (IntPtr.Size * 8) < case 64: osbits = SoftwareArchitecture.x64; break; case 32: if (Is32BitProcessOn64BitProcessor()) osbits = SoftwareArchitecture.x64; else osbits = SoftwareArchitecture.x32; break; default: osbits = SoftwareArchitecture.Unknown; break; >return osbits; > > [DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)] public extern static IntPtr LoadLibrary(string libraryName); [DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)] public extern static IntPtr GetProcAddress(IntPtr hwnd, string procedureName); private delegate bool IsWow64ProcessDelegate([In] IntPtr handle, [Out] out bool isWow64Process);
Вызов: Console.WriteLine($»Версия Вашей ОС: «);
Отслеживать
ответ дан 19 апр 2017 в 21:52
1,979 1 1 золотой знак 17 17 серебряных знаков 33 33 бронзовых знака
- c#
- pinvoke
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как проверить, является ли EXE-файл 32- или 64-битным в Windows 10
Установить десктопное приложение проще простого, главное, чтобы тип исполняемого файла соответствовал архитектуре процессора. На 64-битные системы можно устанавливать и 32— и 64-битные приложения, тогда как на 32-битные Windows возможна установка только 32-битных программ. Обычно в источниках указывается разрядность приложения, но вы легко можете узнать ее и сами, воспользовавшись консольной утилитой от Марка Руссиновича SigCheck.
Скачайте архив с тулзой с официальной странички docs.microsoft.com/en-us/sysinternals/downloads/sigcheck, и распакуйте в каталог System32 . В архиве два файла — для 32- и 64-битной Windows.

Также вы можете распаковать утилиту в любое удобное расположение, но тогда при работе в командной строке придется каждый раз прописывать к ней полный путь.
Чтобы определить разрядность любого исполняемого файла, откройте командную строку или PowerShell и выполните команду следующего вида:
sigcheck.exe "полный путь к EXE-файлу"
Команда вернет набор сведений о файле — описание, имя разработчика, версию и т.д.

Будет среди них и разрядность, указываемая в параметре MachineType.
Если на вашем компьютере установлен архиватор 7-Zip, воспользуйтесь для определения разрядности исполняемого файла им.
Принцип похожий, откройте командную строку и сначала перейдите в расположение 7z.exe , обычно это C:\Program Files\7-Zip и выполните такую команду:
7z.exe l "путь к проверяемому EXE-файлу" | findstr CPU
Разрядность будет показана в значении параметра CPU.

Если решите использовать PowerShell , в начале команды нужно добавить «./» без пробелов и кавычек, таков синтаксис. И не забываем о двойных прямых кавычках, в них необходимо заключать все пути с пробелами и кириллицей.
Как определить разрядность приложения
В настоящее время в связи с распространением 64-разрядных процессоров и операционных систем, перед разработчиками программного обеспечения часто встаёт вопрос о программном определении его разрядности.
Это может быть вызвано как декоративными причинами («автоматически» показывать разрядность пользователю, например, «Моя Программа 1.0 64-разрядная версия») так и необходимостью задействовать в различных архитектурах различные алгоритмы с целью максимально эффективного использования их особенностей и при этом сохранить единую кодовую базу.
Простейшие способы
В Delphi для того чтобы определить разрядность приложения достаточно получить размер не типизированного указателя с помощью стандартного приёма:
sizeof(Pointer);
В результате будет возвращён размер не типизированного указателя в байтах. Для перевода в биты достаточно умножить полученный результат на 8. В случае 32-разрядного приложения результат будет равен 4 (после умножения 32). В случае же 64-разядного приложения результат будет равен 8 (после умножения 64).
Для C++ существует аналогичный приём:
sizeof(void*);
Похожий способ есть и в языке C#. Для того чтобы определить разрядность необходимо узнать размер типа IntPtr. Однако этот тип не имеет предопределённого размера и поэтому прямое использование функции sizeof вызовет синтаксическую ошибку.
Вследствие этого необходимо использовать метод SizeOf класса Marshal из пространства имён System.Runtime.InteropServices (это пространство имён должно быть предварительно задействовано с помощью директивы using).
В результате реализация для C# выглядит следующим образом:
Marshal.SizeOf(typeof(IntPtr));
Конечно, это немного более громоздко, чем в случае Delphi или C++.
Всё эти методы предельно просты и доступны даже для начинающих. Однако все они имеют один общий недостаток. При их использовании в программе компилируются одновременно оба варианта кода (и для 32 и для 64-разрядного приложения). В случае небольших проектов или несущественных отличий в алгоритмах между версиями это может оказаться не критично. В противном случае значительный размер программы будет составлять неиспользуемый код. Это приведёт неоправданному увеличению размеров исполняемого файла программы или файла библиотеки в случае DLL. По этой причине все вышеперечисленные методы для реализации специального кода для конкретной архитектуры по большому счёту не пригодны.
Условная компиляция
К счастью, для этого существует альтернатива в виде директив условной компиляции.
В Delphi имеется стандартный символ условной компиляции WIN32, который обозначает 32-разрядную версию операционной системы Windows. С помощью этого символа и директивы компилятора $IFDEF можно указать, какой код будет компилироваться в случае 32-разрядного приложения, а какой в случае 64-разрядного.
Для наглядности приведём простейший пример:
ShowMessage(‘x86’); ShowMessage(‘x64’);
Если приложение 64-разрядное, то будет показано сообщение с текстом «x64».
В C# ситуация значительно сложнее. .Там нет встроенных символов компиляции соответствующих архитектуре по аналогии с вышеупомянутым WIN32 в Delphi. Но их можно легко создать вручную.
Для этого нужно в свойствах проекта, на вкладке «Построение» в поле «Символы условной компиляции» ввести необходимые символы. Например, «x86» и «x64».
После этого можно воспользоваться вновь созданными символами для того чтобы указать какой именно код для какой архитектуры должен компилироваться.
Для этого следует использовать директиву #if.
#if x86 MessageBox.Show("x86"); #elif x64 MessageBox.Show("x64"); #endif
В принципе, для решения данной задачи вполне можно обойтись и одним символом. Однако вариант с двумя символами в силу своей большей избирательности обеспечивает лучшее сопровождение кода. Пример приведённый для Delphi проще. Но, в случае его использования на любой платформе отличной от Win32 в файле приложения окажется код предназначенный в том числе для Win64.
Что же касается C++, то ввиду разнообразия компиляторов и различий в их спецификациях конкретное универсальное решение отсутствует. В самом общем случае можно воспользоваться способами, приведёнными для Delphi и C# с поправкой на особенности используемого компилятора.