Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1355671163
dummy_user
2012-12-16 19:19
2013.08.25
Странное поведение функции.


1-1311150598
FosterGrand
2011-07-20 12:29
2013.08.25
Сбой кодировки в ToolBar


2-1355729101
Phoenix7
2012-12-17 11:25
2013.08.25
уникальное имя файла


15-1364050360
О-Сознание
2013-03-23 18:52
2013.08.25
Web Money и уведомление на почту.


15-1364034591
Artem
2013-03-23 14:29
2013.08.25
Просмотр файлов cookie (логины пароли) в firefox offline





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский