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