Узнать разрядность windows delphi

Узнать разрядность windows delphi

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

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


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

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

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

А это что значит? — «И чтобы гарантировано работало с хп по сервак 2008 р2.»


Gu ( 2011-01-29 13:25 ) [2]

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

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

>> А это что значит
определялось на ОС с .. по ..


Gu ( 2011-01-29 13:31 ) [3]

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


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]

Ты спрашиваешь глупость, абсурд — разрядность ОС определяется не
разрядностью процессора, а ПО


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

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

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


Gu ( 2011-01-29 14:45 ) [7]

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

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


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

Читайте также:  Надстройки для excel mac os

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

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

Узнать разрядность windows delphi

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


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

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


leonidus ( 2010-02-21 14:27 ) [2]

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


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

leonidus (21.02.10 14:27) [2]

http://msdn.microsoft.com/en-us/library/ms684139(VS.85).aspx чем не пример ?
Там же написано:

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.


Игорь Шевченко © ( 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;

var
Form1: TForm1;

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;


> leonidus


> Рыл в сторону IsWow64Process, но я так понял это только
> для определения разрядности всей ОС.

Нет, для определения разрядности ОС надо смотреть ProcessorArchitecture (см. модуль в соседней ветке). IsWow64Process — это как раз говорит о том что твоя 32 разрядная программа запущена в 64 разрядной среде.

Читайте также:  Восстановление удаленных файлов с жесткого диска windows


leonidus ( 2010-02-21 21:39 ) [6]

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

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


leonidus ( 2010-02-21 21:45 ) [7]

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


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


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

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

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


leonidus ( 2010-02-21 22:05 ) [9]

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

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


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


DVM © ( 2010-02-21 22:49 ) [11]

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


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

DVM © (21.02.10 22:49) [11]


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

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


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

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

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


leonidus ( 2010-02-22 11:44 ) [14]

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

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

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

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

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


leonidus ( 2010-02-22 12:26 ) [16]

Читайте также:  Линукс сколько людей пользуются

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


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

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


leonidus ( 2010-02-22 16:56 ) [18]

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

Узнать разрядность windows delphi

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

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

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

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

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

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

Информация о разрядности exe содержится в секции Optional Header NT заголовка exe файла. А конкретно это:
Nt Header -> Optional Header -> Magic
$10b — x32
$20b — x64

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

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

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

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

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

Оцените статью