Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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 Чтобы немного уточнить: Цикл в обоих случаях срабатывает единожды, пид одинаковый.

Последний раз редактировалось nixon232, 26.05.2018 в 13:07.
Ответить с цитированием
  #2  
Старый 26.05.2018, 20:52
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Немного некорректные вопросы.
Как я Понял OpenProcess всегда выдает разный хендл. Так что вопрос 1 вроде как снят.
По CloseHandle, тут его вообще не имеет смысла делать, если собираешься использовать вне функции. Когда выполняю CloseHandle внутри функции, то c результом я уже нечего не сделаю.
Сам спросил - сам ответил
Правильно хоть понял?

Последний раз редактировалось nixon232, 26.05.2018 в 20:55.
Ответить с цитированием
  #3  
Старый 26.05.2018, 21:29
Zorkov Igor Zorkov Igor вне форума
Новичок
 
Регистрация: 28.07.2009
Сообщения: 85
Репутация: 50
По умолчанию

Правильно понял

Код:
fHProcess:= GetProcessHandle('FileName');

if fHProcess <> 0 then
begin
  try
    //Сделать что то с хендлом
  finally
    CloseHandle(fHProcess);
  end;
end;
Ответить с цитированием
  #4  
Старый 26.05.2018, 21:35
Zorkov Igor Zorkov Igor вне форума
Новичок
 
Регистрация: 28.07.2009
Сообщения: 85
Репутация: 50
По умолчанию

Цитата:
3) неверняка, PROCESS_ALL_ACCESS тут излишне высок. что лучше использовать?

Доступ PROCESS_ALL_ACCESS лучше не использовать

Если запрашиваешь только информацию то PROCESS_QUERY_INFORMATION или PROCESS_QUERY_LIMITED_INFORMATION в зависимости от ОС
Ответить с цитированием
Этот пользователь сказал Спасибо Zorkov Igor за это полезное сообщение:
nixon232 (26.05.2018)
Ответ



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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:00.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram