![]() |
|
|
#1
|
|||
|
|||
|
Код:
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)
| ||