Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2013, 12:24   #1
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию OpenProcess работает не правильно

Моя задача - определить по PID, жив ли процесс

Написал небольшую функцию
Код:
function CheckPricess(PID:integer):boolean;
var
  hProcess:Cardinal;
begin
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, PID);
  if (hProcess>0) then begin
    CloseHandle(hProcess);
    result:=True;
  end else begin
    result:=False;
  end;
end;
Но даже если завершить процесс, результат True!

В чём проблема?

Предварительно контролируемый процесс создаётся так:
Код:
        CreateProcess(nil,Pchar('"'+F3+'" '+IntToStr(info)),nil,nil,False,0,nil,nil,si,pi);
        f3_pid:=pi.dwProcessId;
lollollollol вне форума Ответить с цитированием
Старый 10.09.2013, 12:56   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Моя задача - определить по PID, жив ли процесс
Очень странное использование CreateProcess, т.к. он для это не предназначен совсем, никак не подходит.

Держите:
Используется PsAPI
Код:
function GetProcessImageFileName(hProcess: DWORD; lpImageFileName: LPTSTR; nSize: DWORD)
  : DWORD; stdcall; external 'PSAPI.dll' name 'GetProcessImageFileNameW';
function GetProcessPath(aPID: Cardinal): string;
function ProcessExists(aName: string; out aFullPath: string; out aPID: Cardinal)
  : Boolean; overload;

...
function ProcessExists(aName: string; out aFullPath: string; out aPID: Cardinal): Boolean;
var
  aProcess: array [0 .. 1024] of DWORD;
  BytesNum: DWORD;
  i, iCount: integer;
  sPath: string;
begin
  Result := False;
  if EnumProcesses(@aProcess, SizeOf(aProcess), BytesNum) then
  begin
    iCount := BytesNum div SizeOf(DWORD);

    for i := 0 to iCount do
    begin
      sPath := GetProcessPath(aProcess[i]);
      if (aProcess[i] <> ERROR_SUCCESS) then
      begin
        if (CompareStr(Trim(LowerCase(aName)), Trim(LowerCase(ExtractFileName(sPath)))
          ) = 0) then
        begin
          Result := True;
          aPID := aProcess[i];
          aFullPath := sPath;
          Break;
        end;

      end;
    end;
  end;
end;

function GetProcessPath(aPID: Cardinal): string;
var
  cPath: array [0 .. MAX_PATH] of Char;
  hProcess: THandle;
begin
  Result := '';
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, aPID);
  try
    if (hProcess > 0) then
    begin
      if GetProcessImageFileName(hProcess, @cPath, SizeOf(cPath)) <> 0 then
        Result := DevicePathToWin32Path(cPath);
    end;
  finally
    CloseHandle(hProcess)
  end;
end;
Первая функция возвращает путь к образу процесса и его PID, если результат функции True.
Вторая функция, по PID получает путь к образу процесса.

Последний раз редактировалось Человек_Борща; 10.09.2013 в 13:00.
Человек_Борща вне форума Ответить с цитированием
Старый 10.09.2013, 13:12   #3
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Код:
function GetProcessPath(aPID: Cardinal): string;
var
  cPath: array [0 .. MAX_PATH] of Char;
  hProcess: THandle;
begin
  Result := '';
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, aPID);
  try
    if (hProcess > 0) then
    begin
      if GetProcessImageFileName(hProcess, @cPath, SizeOf(cPath)) <> 0 then
        Result := DevicePathToWin32Path(cPath);
    end;
  finally
    CloseHandle(hProcess)
  end;
end;
Заметь, вторая функция приведённая тобой почти тоже самое.
Я уже второй час не могу понять почему попытка открыть процесс которого УЖЕ нет завершается успехом?

Т.е. когда процесса небыло вовсе, OpenProcess возвращала False.
Когда создал процесс, OpenProcess возвращает True,
И после завершения оно по прежнему возвращает True, но процесса уже не существует!
очень хотелось бы разобраться в причинах
lollollollol вне форума Ответить с цитированием
Старый 10.09.2013, 13:14   #4
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Цитата:
Очень странное использование CreateProcess, т.к. он для это не предназначен совсем, никак не подходит.
CreateProcess? я им создаю процесс, а OpenProcess проверяю
lollollollol вне форума Ответить с цитированием
Старый 10.09.2013, 14:03   #5
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

нашел функцию DevicePathToWin32Path,
[Error] Undeclared identifier: 'posex'
[Error] Undeclared identifier: 'sametext'
А откуда это они?
lollollollol вне форума Ответить с цитированием
Старый 10.09.2013, 14:16   #6
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

как определить жив ли процесс зная PID?
lollollollol вне форума Ответить с цитированием
Старый 10.09.2013, 17:32   #7
asmprog
Пользователь
 
Регистрация: 10.08.2013
Сообщений: 67
По умолчанию

если правильно понял, то кроме PID есть еще hProcess(или hProcess можно по PID взять).
Код:
var
  Form1: TForm1;
  pPI: TProcessInformation;
  si : _STARTUPINFOA;
...
procedure TForm1.FormCreate(Sender: TObject);
begin

  ZeroMemory(@si,SizeOf(_STARTUPINFOA));
  si.cb := SizeOf(_STARTUPINFOA);
  si.dwFlags := STARTF_USESHOWWINDOW;
  si.wShowWindow := SW_SHOW;

  CreateProcess(nil,PChar('winmine.exe'),nil,nil,False,0,nil,Pchar(ExtractFilePath(Application.ExeName)),si,pPI);
  tmr1.Enabled := True;

end;


procedure TForm1.tmr1Timer(Sender: TObject);
var
  state : Cardinal;
begin

  state := WaitForSingleObject(pPI.hProcess,200);

    if state = WAIT_OBJECT_0 then

        lbl1.Caption := 'Process terminated'

    else if state = WAIT_TIMEOUT then

      lbl1.Caption := 'Process alive'

    else
      lbl1.Caption := 'Some error';

end;

Последний раз редактировалось asmprog; 10.09.2013 в 22:53.
asmprog вне форума Ответить с цитированием
Старый 10.09.2013, 22:20   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
как определить жив ли процесс зная PID?
Через OpenProcess открыть процесс через PID и проверить условие hProcess = 0, если да, то процесс не существует с таким PID.
Человек_Борща вне форума Ответить с цитированием
Старый 10.09.2013, 22:48   #9
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

ОгА, но мой первый!!! пост, я так и делаю!!! Оно возвращает хендл процесса который уже не существует


Код:
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, PID);
  if (hProcess>0) then begin
    CloseHandle(hProcess);
    result:=True;
  end else begin
    result:=False;
  end;
lollollollol вне форума Ответить с цитированием
Старый 11.09.2013, 03:11   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если вы создавали процесс сами то у вас есть его хендл через него можно все узнать. в том числе код завершения или Still alive.
а процесс существует пока открыт хоть одип хендл на него.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenProcess не возвращает дескриптор :(((( exclu$ive Win Api 4 20.01.2014 07:46
OpenProcess под отладчиком работает,а без него -нет calypso Win Api 4 21.03.2013 02:53
OpenProcess Лета Win Api 5 16.06.2012 17:18
Не работает правильно!!! Vitalik1 Помощь студентам 2 01.11.2011 23:11
Не правильно (или правильно?) работает позиционирование в WebKit mutabor HTML и CSS 5 09.12.2010 09:54