Конференция "WinAPI" » Определение разрядности программы [D6, WinXP]
 
  • leonidus (21.02.10 11:29) [0]
    Как зная хендл окна, определить оно принадлежит 32-х битному приложения или 64-х битному? Рыл в сторону IsWow64Process, но я так понял это только для определения разрядности всей ОС.
  • Игорь Шевченко © (21.02.10 13:58) [1]
    Неправильно понял. Это для определения разрядности процесса в 64-битной ОС
  • leonidus (21.02.10 14:27) [2]
    Игорь, а можно примерчика как использовать эту функцию?
  • Игорь Шевченко © (21.02.10 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.
  • Игорь Шевченко © (21.02.10 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 © (21.02.10 21:37) [5]

    > leonidus


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

    Нет, для определения разрядности ОС надо смотреть ProcessorArchitecture (см.  модуль в соседней ветке). IsWow64Process - это как раз говорит о том что твоя 32 разрядная программа запущена в 64 разрядной среде.
  • leonidus (21.02.10 21:39) [6]
    Игорь, большое спасибо!

    Я правильно понял, что подразумевается, что в Edit1 будет хендл нужного мне приложения и в зависимости от того 64-х битное оно или нет, я буду получать разные сообщения?
  • leonidus (21.02.10 21:45) [7]
    Да, у меня 32-х разрядное приложение, оно может работать и под 64-х битной виндой и мониторить другие приложения.  Мне нужно по хендлу окна понять передомное программа 64-х битная или 32-х битная.
  • Игорь Шевченко © (21.02.10 22:03) [8]

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


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

    Приведенный код проверен под 64-битной Windows 7
  • leonidus (21.02.10 22:05) [9]
    >будет идентификатор процесса.
    прошу прощения не понял...

    Я делаю так:

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

    т.е. по Wnd мне нужно определить разрядность приложения.
  • Игорь Шевченко © (21.02.10 22:07) [10]

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


    GetWindowThreadProcessId
  • DVM © (21.02.10 22:49) [11]
    Интересно, а что будет определяться для Google Chrome, никто не проверял? У него ведь каждая вкладка в окне порождена отдельным процессом.
  • Игорь Шевченко © (21.02.10 23:05) [12]
    DVM ©   (21.02.10 22:49) [11]


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


    У IE8 тоже. Определяется по разрядности EXEшника
  • Eraser © (21.02.10 23:53) [13]
    > [11] DVM ©   (21.02.10 22:49)

    у хрома рендерит по-моему хостовый процесс, а вот у IE интереснее, там реально внутреннее окно с содержимым страницы прендлежит другому процессу.
  • leonidus (22.02.10 11:44) [14]
    Если в ShowWow64 передавать не GetCurrentProcessId, а хендл полученный в результате работы кода:

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

    то все время ловлю RaiseLastOsError. В чем тут проблема?
  • Anatoly Podgoretsky © (22.02.10 12:07) [15]
    > leonidus  (22.02.2010 11:44:14)  [14]

    Дельфи делает только 32 разрядные программы.
  • leonidus (22.02.10 12:26) [16]
    Анатолий, при чет тут Delphi? Я же писал, что моя программа мониторит другие приложения, это их разрядность нужно определять.
  • Игорь Шевченко © (22.02.10 14:42) [17]

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


    В отсутствии понимания разницы между ProcessId и ProcessHandle.
    В нежелании напрячь собственный мозг.
    В неуважении к отвечающим.
  • leonidus (22.02.10 16:56) [18]
    Игорь, спасибо за код, но адский пафос этого форума просто убивает. Топик можно закрывать, всем спасибо.
 
Конференция "WinAPI" » Определение разрядности программы [D6, WinXP]
Есть новые Нет новых   [134431   +16][b:0][p:0.001]