Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.08.25;
Скачать: CL | DM;

Вниз

Определение разрядности программы   Найти похожие ветки 

 
leonidus   (2010-02-21 11:29) [0]

Как зная хендл окна, определить оно принадлежит 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 где-то так:

unit main;

interface

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;

implementation

{$R *.dfm}

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;

end.


 
DVM ©   (2010-02-21 21:37) [5]


> leonidus


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

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


 
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]

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

Я делаю так:

GetCursorPos(pt_start);
Wnd:= WindowFromPoint(pt_start);

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


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


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


GetWindowThreadProcessId


 
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. В чем тут проблема?


 
Anatoly Podgoretsky ©   (2010-02-22 12:07) [15]

> 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]

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



Страницы: 1 вся ветка

Текущий архив: 2013.08.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
1-1311150598
FosterGrand
2011-07-20 12:29
2013.08.25
Сбой кодировки в ToolBar


2-1355449898
Айдар
2012-12-14 05:51
2013.08.25
Об округлении в Delphi.


15-1363818230
Германн
2013-03-21 02:23
2013.08.25
Космический аппарат вышел за пределы Солнечной системы!


15-1363663611
Йети
2013-03-19 07:26
2013.08.25
где скачать BDE?


4-1266740974
leonidus
2010-02-21 11:29
2013.08.25
Определение разрядности программы