Перейти к содержимому

Как узнать разрядность dll файла

  • автор:

Как определить разрядность .EXE или .DLL?

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

link.exe /dump /headers

link.exe /dump /headers

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

dumpbin.exe /headers

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.

Проводник - sigcheck.exe

Также вы можете распаковать утилиту в любое удобное расположение, но тогда при работе в командной строке придется каждый раз прописывать к ней полный путь.

Чтобы определить разрядность любого исполняемого файла, откройте командную строку или PowerShell и выполните команду следующего вида:

sigcheck.exe "полный путь к EXE-файлу"

Команда вернет набор сведений о файле — описание, имя разработчика, версию и т.д.

SigCheck

Будет среди них и разрядность, указываемая в параметре MachineType.

Если на вашем компьютере установлен архиватор 7-Zip, воспользуйтесь для определения разрядности исполняемого файла им.

Принцип похожий, откройте командную строку и сначала перейдите в расположение 7z.exe , обычно это C:\Program Files\7-Zip и выполните такую команду:

7z.exe l "путь к проверяемому EXE-файлу" | findstr CPU

Разрядность будет показана в значении параметра CPU.

7-Zip

Если решите использовать 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# с поправкой на особенности используемого компилятора.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *