Форум: "WinAPI";
Текущий архив: 2013.08.25;
Скачать: [xml.tar.bz2];
ВнизОпределение разрядности программы Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2013.08.25;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.003 c