|
#1
|
|||
|
|||
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
|
|||
|
|||
Немного некорректные вопросы.
Как я Понял OpenProcess всегда выдает разный хендл. Так что вопрос 1 вроде как снят. По CloseHandle, тут его вообще не имеет смысла делать, если собираешься использовать вне функции. Когда выполняю CloseHandle внутри функции, то c результом я уже нечего не сделаю. Сам спросил - сам ответил Правильно хоть понял? Последний раз редактировалось nixon232, 26.05.2018 в 20:55. |
#3
|
|||
|
|||
Правильно понял
Код:
fHProcess:= GetProcessHandle('FileName'); if fHProcess <> 0 then begin try //Сделать что то с хендлом finally CloseHandle(fHProcess); end; end; |
#4
|
|||
|
|||
Цитата:
Доступ PROCESS_ALL_ACCESS лучше не использовать Если запрашиваешь только информацию то PROCESS_QUERY_INFORMATION или PROCESS_QUERY_LIMITED_INFORMATION в зависимости от ОС |
Этот пользователь сказал Спасибо Zorkov Igor за это полезное сообщение: | ||
nixon232 (26.05.2018)
|