определение разрядности windows в delphi

Определение версии и разрядности Windows в Delphi 6 и применение манифеста

Создание манифеста для программы на Delphi 6 о том что программа поддерживает Windows 10

Начну с того что данный способ определения версий windows для операционных систем выше Windows 8.0 будет корректно работать только при подключении манифеста, а именно например строчкой supportedOS внутри файла манифеста Вы должны явным образом указать какие операционные системы поддерживает Ваша программа. Иначе версия для ОС старше Windows 8.0 будет определяться как Windows 8.0.

Для создания файла манифеста создайте файл с названием и расширением Project1.exe.manifest и разместите в нём следующий текст в UTF-8 кодировке(я написал в названии файла Project1.exe.manifest поскольку моя программа называлась именно так):

Далее создайте файл с названием и расширением manifest.rc и поместите в него следующий текст:

1 24 «Project1.exe.manifest»

После этого в командной строке перейдите в папке где находятся файлы Project1.exe.manifest и manifest.rc(для перехода в папку используется команда cd адрес) и выполните следующий код:

Если команда выполнилась успешно в папке появится файл manifest.res если выполнение произошло с ошибкой, то почитайте какие файлы нужны для выполнения brcc32.exe в этой статье.

Полученный с помощью выполнения указанной выше команды файл manifest.res поместите в папку проекта на Delphi, непосредственно в коде проекта манифест подключается стройкой <$R manifest.res>в implementation в листинге программы, который я приведу в статье ниже данная строчка будет присутствовать.

Определение версии Windows в Delphi 6

Определить версию операционной системы Windows в Delphi 6 можно используя Win32Platform, Win32MajorVersion, Win32MinorVersion и Win32BuildNumber. Для примера создадим в Delphi новый проект и на форме разместим Memo1 и Button1 далее заменим весь код проекта на код из листинга:

Так же версия операционной системы может быть каким то образом определена исходя из менений в Интернет с использованием экземпляра объекта OSVersionInfo, как именно я пока не разбирался.

Функция для Delphi определения является ли Windows 64 битным

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

Вы так же можете прочитать следующие статьи:

Источник

Определение разрядности windows в delphi

Определение разрядности (битности) программы.

Вобщем возник такой вопрос (возможно глупый, не исключаю smile), как определить разрядность той или иной программы?
Тоесть 64 или 32, как это делает task manager в windows 7 (64-x).

5243a3fc0015

И еще вопрос, сейчас скинул другу программу собранную под delphi 7 в 64 разрядной windows 7.
И у него не запустилось (приложение не является win32 совместимым) на windows vista.
Как такое может быть?Или с какой ОС компилируешь такая битность и будет?

Сначала думал, что task manager просто смотрит каталог откуда запущен экзешник, и если
каталог Program Files (x86) то 32 бита, но свеже скопилированную программу лежащую совершенно в другом месте он свободно определил как 64 битную.

Причем программа была скомпилирована на дельфи 7.

Что-то совсем запутался, подскажите, знающие, заранее спасибо.

приложение собранное для 64 битной систмы не может быть запущено в 32 разрядной системе.
Битность приложения зависит от компилятора(в d7-dXE компилятор x32), которым было собрано приложения(я так думаю).

Не думаю что твоя проблема зависит от того в какой системе собран exe.

Ну вот, программа собрана на дельфи 7 на 64 битной семерке, и определяется как 64 битная.

А почему так, не могу понять..Ведь программа должна быть 32 битной, а она 64..мистика

Видимо таки 32 битная программа после компиляции, значит глюк диспетчера задач.

Источник

Как определить разрядность приложения

В настоящее время в связи с распространением 64-разрядных процессоров и операционных систем, перед разработчиками программного обеспечения часто встаёт вопрос о программном определении его разрядности.

Это может быть вызвано как декоративными причинами («автоматически» показывать разрядность пользователю, например, «Моя Программа 1.0 64-разрядная версия») так и необходимостью задействовать в различных архитектурах различные алгоритмы с целью максимально эффективного использования их особенностей и при этом сохранить единую кодовую базу.

Простейшие способы

В Delphi для того чтобы определить разрядность приложения достаточно получить размер не типизированного указателя с помощью стандартного приёма.

В результате будет возвращён размер не типизированного указателя в байтах. Для перевода в биты достаточно умножить полученный результат на 8. В случае 32-разрядного приложения результат будет равен 4 (после умножения 32). В случае же 64-разядного приложения результат будет равен 8 (после умножения 64).

Для C++ существует аналогичный приём.

Похожий способ есть и в языке C#. Для того чтобы определить разрядность необходимо узнать размер типа IntPtr. Однако этот тип не имеет предопределённого размера и поэтому прямое использование функции sizeof вызовет синтаксическую ошибку.

Вследствие этого необходимо использовать метод SizeOf класса Marshal из пространства имён System.Runtime.InteropServices (это пространство имён должно быть предварительно задействовано с помощью директивы using). В результате реализация для C# выглядит следующим образом:

Конечно, это немного более громоздко, чем в случае Delphi или C++.

Всё эти методы предельно просты и доступны даже для начинающих. Однако все они имеют один общий недостаток. При их использовании в программе компилируются одновременно оба варианта кода (и для 32 и для 64-разрядного приложения). В случае небольших проектов или несущественных отличий в алгоритмах между версиями это может оказаться не критично. В противном случае значительный размер программы будет составлять неиспользуемый код. Это приведёт неоправданному увеличению размеров исполняемого файла программы или файла библиотеки в случае DLL. По этой причине все вышеперечисленные методы для реализации специального кода для конкретной архитектуры по большому счёту не пригодны.

Условная компиляция

К счастью, для этого существует альтернатива в виде директив условной компиляции.

Для наглядности приведём простейший пример:

Источник

Определение разрядности windows в delphi

Как зная хендл окна, определить оно принадлежит 32-х битному приложения или 64-х битному? Рыл в сторону IsWow64Process, но я так понял это только для определения разрядности всей ОС.

topdown
Игорь Шевченко © ( 2010-02-21 13:58 ) [1]

Неправильно понял. Это для определения разрядности процесса в 64-битной ОС

Игорь, а можно примерчика как использовать эту функцию?

topdown
Игорь Шевченко © ( 2010-02-21 15:34 ) [3]

leonidus (21.02.10 14:27) [2]

Wow64Process [out]
A pointer to a value that is set to TRUE if the process is running under WOW64. If the process is running under 32-bit Windows, the value is set to FALSE. If the process is a 64-bit application running under 64-bit Windows, the value is also set to FALSE.

topdown
Игорь Шевченко © ( 2010-02-21 15:37 ) [4]

На Delphi где-то так:

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
procedure ShowWow64 (ProcessHandle: THandle);
end;

type
TIsWow64Process = function (H: THandle; Value: PBOOL): BOOL; stdcall;
var
_IsWow64Process: TIsWow64Process;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowWow64(GetCurrentProcess);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Pid: Cardinal;
ProcessHandle: THandle;
begin
Pid := StrToIntDef(Edit1.Text, GetCurrentProcessId);
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, false, Pid);
if ProcessHandle <> 0 then
try
ShowWow64(ProcessHandle);
finally
CloseHandle(ProcessHandle);
end
else
ShowMessageFmt(«Can»»t open process %.8x», [Pid]);
end;

procedure TForm1.ShowWow64(ProcessHandle: THandle);
const
ProcessInfos: array[Boolean] of string = (
«not running under Wow64», «running under Wow64»
);
var
RunWow64: BOOL;
begin
@_IsWow64Process := GetProcAddress(GetModuleHandle(«kernel32»), «IsWow64Process»);
if Assigned(_IsWow64Process) then
if _IsWow64Process(ProcessHandle, @RunWow64) then
ShowMessageFmt(«process is %s», [ProcessInfos[RunWow64]])
else
RaiseLastOsError
else
ShowMessage(«IsWow64Process is not implemented»);
end;

Игорь, большое спасибо!

Я правильно понял, что подразумевается, что в Edit1 будет хендл нужного мне приложения и в зависимости от того 64-х битное оно или нет, я буду получать разные сообщения?

Да, у меня 32-х разрядное приложение, оно может работать и под 64-х битной виндой и мониторить другие приложения. Мне нужно по хендлу окна понять передомное программа 64-х битная или 32-х битная.

topdown
Игорь Шевченко © ( 2010-02-21 22:03 ) [8]


> Я правильно понял, что подразумевается, что в Edit1 будет
> хендл нужного мне приложения

будет идентификатор процесса.

Приведенный код проверен под 64-битной Windows 7

>будет идентификатор процесса.
прошу прощения не понял.

т.е. по Wnd мне нужно определить разрядность приложения.


> по Wnd мне нужно определить разрядность приложения

Интересно, а что будет определяться для Google Chrome, никто не проверял? У него ведь каждая вкладка в окне порождена отдельным процессом.

topdown
Игорь Шевченко © ( 2010-02-21 23:05 ) [12]

DVM © (21.02.10 22:49) [11]


> У него ведь каждая вкладка в окне порождена отдельным процессом

У IE8 тоже. Определяется по разрядности EXEшника

topdown
Eraser © ( 2010-02-21 23:53 ) [13]

> [11] DVM © (21.02.10 22:49)

у хрома рендерит по-моему хостовый процесс, а вот у IE интереснее, там реально внутреннее окно с содержимым страницы прендлежит другому процессу.

Если в ShowWow64 передавать не GetCurrentProcessId, а хендл полученный в результате работы кода:

GetCursorPos(pt_start);
Wnd:= WindowFromPoint(pt_start);
idProcess := GetWindowThreadProcessId(Wnd,nil);

то все время ловлю RaiseLastOsError. В чем тут проблема?

> leonidus (22.02.2010 11:44:14) [14]

Дельфи делает только 32 разрядные программы.

Анатолий, при чет тут Delphi? Я же писал, что моя программа мониторит другие приложения, это их разрядность нужно определять.

topdown
Игорь Шевченко © ( 2010-02-22 14:42 ) [17]

В отсутствии понимания разницы между ProcessId и ProcessHandle.
В нежелании напрячь собственный мозг.
В неуважении к отвечающим.

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

Источник

Определение разрядности windows в delphi

Можно как нибудь определить x32\x64 операционки, не по ее билду, а другими способом?
Вот тут есть пример (компонент), но он очень большой и а5 же основан на билде (http://dvmuratov.narod.ru/uWinVersion.pas), по разрядности процессора тоже не покатит, потому как некоторые на х64 проц ставят х32 винду.

И чтобы гарантировано работало с хп по сервак 2008 р2.

topdown
Anatoly Podgoretsky © ( 2011-01-29 13:16 ) [1]

> Gu (29.01.2011 12:26:00) [0]

Если ставять 32 бита Виндос, то разрядность ОС 32 бита и даже если запускают
на 64 битах, то все равно 32 бита.

>> Если ставять 32 бита Виндос, то разрядность ОС 32 бита и даже если запускают на 64 битах, то все равно 32 бита

кто бы спорил. определить разрядность как, при помощи дельфи я спрашиваю а не про установку винды

чтобы была например функция, с результом bool, типа IsWinVERx64

topdown
Anatoly Podgoretsky © ( 2011-01-29 13:35 ) [4]

> Gu (29.01.2011 12:26:00) [0]

И что значит некоторые, ведь 32 битных процессоров давно не существует, а
подавляющее большинство ОС это 32 бита Виндоус.

> Gu (29.01.2011 13:25:02) [2]

topdown
Anatoly Podgoretsky © ( 2011-01-29 13:46 ) [6]

> Gu (29.01.2011 13:31:03) [3]

Речь про Дельфи, так ее пока кроме 32 бит не существует.

нашел http://www.transl-gunsmoker.ru/2010/02/64-windows.html
только там
IsWow64Process := GetProcAddress(Kernel32, «IsWow64Process»);
надо заменить на
IsWow64Process := GetProcAddress(GetModuleHandle(«kernel32»), «IsWow64Process»);
нашел еще пример через реестр, но он мне не понравился

2 Anatoly Podgoretsky
если вам непонятны вопросы не надо на них отвечать

topdown
Anatoly Podgoretsky © ( 2011-01-29 14:53 ) [8]

> Gu (29.01.2011 14:45:07) [7]

А тебе не стоит наезжать, а то отвечать будет некому.

Источник

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии