Тема: GetProcessHandle
Показать сообщение отдельно
  #1  
Старый 26.05.2018, 09:48
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию GetProcessHandle

Код:
function GetProcessHandle(ExeFileName: string): THandle;
var
  ContinueLoop: Bool;
  FSnapshotHandle, fHProcess: THandle;
  fPid: Cardinal;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  fHProcess := 0;
  FSnapshotHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.DwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  while Integer(ContinueLoop) <> 0 do
  begin
    if ((AnsiUpperCase(ExtractFileName(FProcessEntry32.SzExeFile))
      = AnsiUpperCase(ExeFileName)) or (AnsiUpperCase(FProcessEntry32.SzExeFile)
      = AnsiUpperCase(ExeFileName))) then
    begin
      fPid := FProcessEntry32.Th32ProcessID;
      if fPid > 0 then
//        Result := OpenProcess(PROCESS_ALL_ACCESS, False, fPid);
        fHProcess := OpenProcess(PROCESS_ALL_ACCESS, False, fPid);
      if fHProcess > 0 then
      begin
        Result := fHProcess;
        CloseHandle(fHProcess);
//        Result := OpenProcess(PROCESS_ALL_ACCESS, False, fPid);
      end;

    end;

    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;
сначала был кусок
Код:
  Result := OpenProcess(PROCESS_ALL_ACCESS, False, fPid);
и все работало, но потом решил сделать "правильно" и закрыть, что открыл
Код:
fPid := FProcessEntry32.Th32ProcessID;
      if fPid > 0 then
        fHProcess := OpenProcess(PROCESS_ALL_ACCESS, False, fPid);
      if fHProcess > 0 then
      begin
        Result := fHProcess;
        CloseHandle(fHProcess);
//        Result := OpenProcess(PROCESS_ALL_ACCESS, False, fPid);
      end;

И оказалось, что
Код:
 Result := OpenProcess(PROCESS_ALL_ACCESS, False, fPid);
и
Код:
  fHProcess := OpenProcess(PROCESS_ALL_ACCESS, False, fPid);
возвращают разное, не нулевое значение.
и вопросы :
1) Почему.
2) так ли критичен тут CloseHandle() или можно спокойно остаться на первом варианте.
3) неверняка, PROCESS_ALL_ACCESS тут излишне высок. что лучше использовать?
Upd Чтобы немного уточнить: Цикл в обоих случаях срабатывает единожды, пид одинаковый.
Ответить с цитированием