function IsRunning(sName: string): boolean;
var
han: THandle;
ProcStruct: PROCESSENTRY32; // from "tlhelp32" in uses clause
sID: string;
begin
Result := false;
// Get a snapshot of the system
han := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if han = 0 then
exit;
// Loop thru the processes until we find it or hit the end
ProcStruct.dwSize := sizeof(PROCESSENTRY32);
if Process32First(han, ProcStruct) thenbeginrepeat
sID := ExtractFileName(ProcStruct.szExeFile);
// Check only against the portion of the name supplied, ignoring caseif uppercase(copy(sId, 1, length(sName))) = uppercase(sName) thenbegin// Report we found it
Result := true;
Break;
end;
untilnot Process32Next(han, ProcStruct);
end;
// clean-up
CloseHandle(han);
end;
Код, который вы предоставили, - это функция Delphi, называемая IsRunning, которая проверяет, запущен ли процесс с заданным именем на системе Windows 9x. Вот подробное описание того, что код делает:
Создается снимок всех запущенных процессов с помощью функции CreateToolhelp32Snapshot из библиотеки kernel32.
Инициализируется структура PROCESSENTRY32, чтобы хранить информацию о каждом процессе.
Код затем проходит по списку процессов, используя функции Process32First и Process32Next, которые возвращают следующий процессный вход в снимке.
Для каждого процесса извлекается имя исполняемого файла с помощью функции ExtractFileName из модуля SysUtils.
Проверяется, если извлеченное имя совпадает с заданным именем процесса (игнорируя регистр) сравнивая верхний регистр обеих строк с помощью функций Copy и Uppercase.
Если найдено совпадение, то переменная Result устанавливается в true и цикл заканчивается.
Наконец, закрыт handle снимка с помощью функции CloseHandle.
Альтернативное решение может быть использовать API OpenProcess и GetExitCodeProcess, чтобы проверить, запущен ли процесс, но это требует больше усилий и знаний Windows API.
Вот пример использования этих API:
functionIsRunning(sName:string):boolean;varhProcess:THandle;beginResult:=false;hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION,False,StrToIntDef(GetProcessIdFromName(sName),0));ifhProcess<>0thenbeginResult:=True;CloseHandle(hProcess);end;end;functionGetProcessIdFromName(sName:string):string;varsID:string;begin// Implement your own logic to get the process ID from the name// For example, you can use a dictionary to map process names to IDsResult:='12345';// Replace with actual IDend;
Обратите внимание, что это подход требует больше работы и знаний Windows API, но предоставляет более гибкость и контроль над проверкой процессов.
Рассмотрена проблема определения запущенного процесса в операционной системе Windows 9x с помощью функции CreateToolhelp32Snapshot и Process32First/Process32Next, а также предложено программное решение на языке Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.