powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проверка наличия запущенного процесса по полному "пути к образу"
9 сообщений из 9, страница 1 из 1
Проверка наличия запущенного процесса по полному "пути к образу"
    #39492195
Q640
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо определить запущен ли процесс, зная его "Путь к образу" (как это названо в Диспетчере Задач), то есть полный путь к файлу, например: C:\Windows\System32\calc.exe
Мне известен такой способ:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
function FindTask(ExeFullPath: String): Boolean;
var FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; ExeFile: String;
begin
Result:=False;
Log.Debug('Приступили к поиску >'+ExeFullPath+'<');
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (FSnapshotHandle<>INVALID_HANDLE_VALUE) then
    begin
    Log.Debug('Toolhelp32Snapshot успешно создан');
    FillChar(FProcessEntry32, SizeOf(FProcessEntry32), 0);
    FProcessEntry32.dwSize:=SizeOf(FProcessEntry32);
    ExeFullPath:=AnsiUpperCase(Trim(ExeFullPath));
    if Process32First(FSnapshotHandle, FProcessEntry32) then
        begin 
        Log.Debug('Входим в цикл по процессам');
        repeat
            ExeFile:=FProcessEntry32.szExeFile;
            Log.Debug('Найдено: >'+ExeFile+'<');
            ExeFile:=AnsiUpperCase(Trim(ExeFile));
            if AnsiCompareText(ExeFullPath, ExeFile)=0 then
                begin
                Log.Debug('Совпало с искомым, поиск завершён');
                Result:=True;
                break;
                end
            else
                Log.Debug('Не совпало с искомым, продолжаем поиск...');
        until
            not Process32Next(FSnapshotHandle, FProcessEntry32);
        Log.Debug('Следующего нету, вышли из цикла по процессам');
        end
    else
        Log.Error('Process32First ничего не нашёл');
    if CloseHandle(FSnapshotHandle) then
        Log.Debug('Toolhelp32Snapshot успешно закрыт')
    else
        Log.Error('Закрытие Toolhelp32Snapshot провалилось');
    end
else
    Log.Error('Создание Toolhelp32Snapshot провалилось');
end;



Но тут проблема в том что сравнивается с TProcessEntry32.szExeFile, а оно содержит только имя файла, без пути (во всяком случае у меня на Win7).
Можно конечно впендюрить ExtractFileName(), но представим что у нас есть "calc.exe" в нескольких папках - и проверка будет работать некорректно.

Подскажите что-нибудь? Спасибо!
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса по полному "пути к образу"
    #39492199
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Q640Подскажите что-нибудь?
Мсдн молчит? https://msdn.microsoft.com/en-us/library/windows/desktop/ms684839(v=vs.85).aspx
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса по полному "пути к образу"
    #39492215
Q640
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
оу... Спасибо... Значит что теперь имеется?
* Использовать Module32First/Module32Next вместо Process32First/Process32Next
* QueryFullProcessImageName
* GetModuleFileNameEx
* GetProcessImageFileName
гм... И какой же "лучше"?
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса по полному "пути к образу"
    #39492325
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
20.07.2017 11:42, Q640 пишет:
> Необходимо определить запущен ли процесс, зная его "Путь к образу"

зачем?
какова цель?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса по полному "пути к образу"
    #39492452
Mikhalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
OpenProcess(PROCESS_QUERY_INFORMATION, false, Process_Id);

а затем: QueryFullProcessImageName
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса по полному "пути к образу"
    #39492456
Mikhalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, через EnumProcesses получить список id.

Enumerating All Processes
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса по полному "пути к образу"
    #39492634
Q640
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это как бы и есть цель. Есть полный путь к чужому exe. Надо узнать условно грубо говоря "работает" он или нет.
Пока без подсчёта количества экземпляров, просто "есть ли хоть один такой процесс".

А чего, через CreateToolhelp32Snapshot() не все процессы найдутся? Или почему-то другому не рекомендуете?

Спасибо большое, будем попробовать!
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса по полному "пути к образу"
    #39492739
Mikhalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Q640А чего, через CreateToolhelp32Snapshot() не все процессы найдутся? Или почему-то другому не рекомендуете?
Каких-либо религиозных предпочтений нет - главное чтобы работало.
Это я дернул из куска моего кода, а там было через EnumProcesses.
И EnumProcesses немного побыстрей работает (дергает из системы меньше инфы, поэтому накладные расходы меньше).
EnumProcesses() vs CreateToolhelp32Snapshot()
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса по полному "пути к образу"
    #39495689
Вот вам волшебная функция для определения полного пути по PID процесса. Просто добавьте это в свой код. Но только помните, что в 64-битной системе всегда используйте 64-битную версию вашего ПО, т.к. 32-битная программа не может определять полный путь к 64-битным процессам (в противном случае используйте QueryFullProcessImageName, но эта шняга не работает в XP и 2003, так что лучше способ выше). Если выполнять эти условия по битности, то это самая надежная функция определения полного пути, никогда не подводила от XP до Windows 10.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
function mywin_set_privilege(const sPrivilege: string; const bEnabled: boolean): boolean;
var
  hToken: THandle;
  TokenPriv: TOKEN_PRIVILEGES;
  PrevTokenPriv: TOKEN_PRIVILEGES;
  ReturnLength: Cardinal;
begin
  Result := true;
  if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
  begin
    if LookupPrivilegeValue(nil, PChar(sPrivilege), TokenPriv.Privileges[0].Luid) then
    begin
      TokenPriv.PrivilegeCount := 1;
      case bEnabled of
        true:
          TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        false:
          TokenPriv.Privileges[0].Attributes := 0;
      end;
      ReturnLength := 0;
      PrevTokenPriv := TokenPriv;
      if not AdjustTokenPrivileges(hToken, false, TokenPriv, SizeOf(PrevTokenPriv), PrevTokenPriv, ReturnLength) then
        Result := false;
    end
    else
      Result := false;
    CloseHandle(hToken);
  end
  else
    Result := false;
end;


function mywin_get_pidpath(const pid: Cardinal; const name: String): String;
var
  b: boolean;
  HM: THandle;
  me: TModuleEntry32;
begin
  Result := '';
  HM := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
  if HM <> INVALID_HANDLE_VALUE then
  begin
    me.dwSize := SizeOf(me);
    b := Module32First(HM, me);
    while b do
    begin
      if FileExists(me.szExePath) and (AnsiLowerCase(me.szModule) = AnsiLowerCase(name)) then
        if (AnsiLowerCase(ExtractFileExt(me.szModule)) = '.exe') and (AnsiPos(':', me.szExePath) > 0) then
        begin
          if AnsiLowerCase(ExtractFileName(me.szExePath)) = AnsiLowerCase(name) then
          begin
            Result := me.szExePath;
            break;
          end;
        end;
      b := Module32Next(HM, me);
    end;
    CloseHandle(HM);
  end;
  if Result = '' then
    Result := name;
end;


Вызывать так

Перед вашей функцией нужно добавить вызов (чтобы мы смогли получать полные пути к системным сервисам и службам):

Код: pascal
1.
mywin_set_privilege('SeDebugPrivilege', true);



а в саму вашу функцию добавить вот такое получение пути по PID ну и далее сравнение сами допишете, если искомый путь и путь определенный для PID совпадает, значит процесс запущен:

Код: pascal
1.
2.
3.
pid_path := mywin_get_pidpath(FProcessEntry32.th32ProcessID, FProcessEntry32.szExeFile);

if (AnsiLowerCase(search_path) = AnsiLowerCase(pid_path)) then ...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проверка наличия запущенного процесса по полному "пути к образу"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]