-
Как зная хендл окна, определить оно принадлежит 32-х битному приложения или 64-х битному? Рыл в сторону IsWow64Process, но я так понял это только для определения разрядности всей ОС.
-
Неправильно понял. Это для определения разрядности процесса в 64-битной ОС
-
Игорь, а можно примерчика как использовать эту функцию?
-
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.
-
На 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
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.
-
> leonidus
> Рыл в сторону IsWow64Process, но я так понял это только > для определения разрядности всей ОС.
Нет, для определения разрядности ОС надо смотреть ProcessorArchitecture (см. модуль в соседней ветке). IsWow64Process - это как раз говорит о том что твоя 32 разрядная программа запущена в 64 разрядной среде.
-
Игорь, большое спасибо!
Я правильно понял, что подразумевается, что в Edit1 будет хендл нужного мне приложения и в зависимости от того 64-х битное оно или нет, я буду получать разные сообщения?
-
Да, у меня 32-х разрядное приложение, оно может работать и под 64-х битной виндой и мониторить другие приложения. Мне нужно по хендлу окна понять передомное программа 64-х битная или 32-х битная.
-
> Я правильно понял, что подразумевается, что в Edit1 будет > хендл нужного мне приложения
будет идентификатор процесса.
Приведенный код проверен под 64-битной Windows 7
-
>будет идентификатор процесса. прошу прощения не понял...
Я делаю так:
GetCursorPos(pt_start); Wnd:= WindowFromPoint(pt_start);
т.е. по Wnd мне нужно определить разрядность приложения.
-
> по Wnd мне нужно определить разрядность приложения
GetWindowThreadProcessId
-
Интересно, а что будет определяться для Google Chrome, никто не проверял? У него ведь каждая вкладка в окне порождена отдельным процессом.
-
DVM © (21.02.10 22:49) [11]
> У него ведь каждая вкладка в окне порождена отдельным процессом
У IE8 тоже. Определяется по разрядности EXEшника
-
> [11] DVM © (21.02.10 22:49)
у хрома рендерит по-моему хостовый процесс, а вот у IE интереснее, там реально внутреннее окно с содержимым страницы прендлежит другому процессу.
-
Если в ShowWow64 передавать не GetCurrentProcessId, а хендл полученный в результате работы кода:
GetCursorPos(pt_start); Wnd:= WindowFromPoint(pt_start); idProcess := GetWindowThreadProcessId(Wnd,nil);
то все время ловлю RaiseLastOsError. В чем тут проблема?
-
> leonidus (22.02.2010 11:44:14) [14]
Дельфи делает только 32 разрядные программы.
-
Анатолий, при чет тут Delphi? Я же писал, что моя программа мониторит другие приложения, это их разрядность нужно определять.
-
> В чем тут проблема?
В отсутствии понимания разницы между ProcessId и ProcessHandle. В нежелании напрячь собственный мозг. В неуважении к отвечающим.
-
Игорь, спасибо за код, но адский пафос этого форума просто убивает. Топик можно закрывать, всем спасибо.
|