Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Определение разрядности программы [D6, WinXP]


leonidus ©   (2010-02-21 11:29:00) 

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


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

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


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


> В чем тут проблема?


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


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

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


Anatoly Podgoretsky   (2010-02-22 12:07:00) [4]

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

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


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

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

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

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


Eraser   (2010-02-21 23:53:00) [6]

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

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


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

DVM ©   (21.02.10 22:49) [11]


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


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


DVM   (2010-02-21 22:49:00) [8]

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


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


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


GetWindowThreadProcessId


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

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

Я делаю так:

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

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


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


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


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

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


leonidus   (2010-02-21 21:45:00) [12]

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


leonidus   (2010-02-21 21:39:00) [13]

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

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


DVM   (2010-02-21 21:37:00) [14]


> leonidus


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

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


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

На 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.


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

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.


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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо