![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определение разрядности программы [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-битной ОС