powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Жив ли процесс?
10 сообщений из 10, страница 1 из 1
Жив ли процесс?
    #34764132
x-a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
x-a
Гость
Как проверить, жив ли процесс с именем , например, "test.exe"?
...
Рейтинг: 0 / 0
Жив ли процесс?
    #34764180
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то типа
Код: plaintext
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.
bool IsAppAlreadyRunning(const char* pExeName)
{
//------------------- если запущен исполняемый файл с именем pExeName функция возвращает true
//PROBLEMS & FIXES***************************************************************************
//									 требует psapi.dll
//*******************************************************************************************
	CString str(pExeName);
	char  exename[ 1025 ];//---------------------- вспомогательная, название exe файла без пути
//--------------------------------------------------- получим список идентификаторов процесса
	DWORD aProcesses[ 1025 ], cbNeeded, cProcesses;
	if(EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
	{
		int		inst				=  0 ;
		char	szProcessName[ 1025 ] = "";
		CString	prc;
		HMODULE hMod;
		HANDLE  hProcess			= NULL;
		DWORD	dwSize				= sizeof(szProcessName) / sizeof(char);
		cProcesses = cbNeeded / sizeof(DWORD); //------------- кол-во возвращенных описателей
		for(UINT i =  0 ; i < cProcesses; i++)//---------------- перебираем хэндлы и сравниваем
		{
//------------------------------------------------------------------- получаем хэндл процесса
			hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);
			if(hProcess)//--------------------------------------------- получим имена модулей
			{
				if(EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
				{
					if(GetModuleBaseNameA(hProcess, hMod, szProcessName, dwSize))
					{//----------------------------------------------------------- сравниваем
						prc = szProcessName;
						if((str.Find(prc) ==  0 ) & (str.GetLength() == prc.GetLength())) 
						{
							CloseHandle(hProcess);
							return true;
						}
					}
				}
				CloseHandle(hProcess);
			}
		}
	}
	return false;
}
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
Жив ли процесс?
    #34764212
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Как проверить, жив ли процесс с именем , например, "test.exe"?

С именем "test.exe" может быть не один процесс, тебе надо будет
подумать про это .
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Жив ли процесс?
    #34764240
x-a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
x-a
Гость
Спасибо, но как-то это сложно...
По поводу того, что с таким именем может быть не один процесс, я это учитываю. Спасибо, что напомнили.
А не подойдет ли для этих целей функция
Код: plaintext
1.
2.
3.
4.
5.
HINSTANCE FindExecutable(      
    LPCTSTR lpFile,
    LPCTSTR lpDirectory,
    LPTSTR lpResult
);
???
...
Рейтинг: 0 / 0
Жив ли процесс?
    #34764369
x-a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
x-a
Гость
Нет, это не то... Эта ф-ция просто ищет файл... Ну должно же быть что-то!
...
Рейтинг: 0 / 0
Жив ли процесс?
    #34764432
x-a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
x-a
Гость
Всем спасибо. Я, похоже, нашла:
Код: plaintext
1.
2.
HMODULE WINAPI GetModuleHandle(
  LPCTSTR lpModuleName
);
:)
...
Рейтинг: 0 / 0
Жив ли процесс?
    #34764453
x-a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
x-a
Гость
Нет, извините, что поторопилась. Это то же не работает.. Неужели остается только то, что написал Cerebrum ?
...
Рейтинг: 0 / 0
Жив ли процесс?
    #34765387
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одной строкой не получится. Еще вариант:
Код: plaintext
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.
#include <tlhelp32.h>
// Поиск процесса
// Возвращает PID или 0 в случае отсутствия
DWORD FindProcess()
{
	HANDLE hProcessSnap = INVALID_HANDLE_VALUE; 
	LPTSTR pszName = NULL;
	DWORD dwPID =  0 ;
	PROCESSENTRY32 pe32 = {sizeof(PROCESSENTRY32)}; 
	__try
	{
		hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,  0 ); 

		if (hProcessSnap != INVALID_HANDLE_VALUE) 
		{
			if(Process32First(hProcessSnap, &pe32)) 
			{
				do 
				{ 
					pszName = pe32.szExeFile + lstrlen(pe32.szExeFile);
					while(pszName > pe32.szExeFile && *pszName != '\\') 
						pszName--;
					if(*pszName == '\\') pszName++;
					if(lstrcmpi(pszName, "test.exe") ==  0 )
						dwPID = pe32.th32ProcessID;
				} 
				while (!dwPID && Process32Next(hProcessSnap, &pe32)); 
			}
		}
	}
	__finally
	{
		if(hProcessSnap != INVALID_HANDLE_VALUE) CloseHandle(hProcessSnap); 
	}
    return (dwPID); 
}

Проще только в том случае если процесс создан из приложения, которое его проверяет (т.е. есть хэндл этого процесса): WaitForSingleObject(hProcess, 0)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
BOOL RunExe(LPTSTR pszCmdLine, LPCTSTR pcszFolder, DWORD dwWaitTime)
{
	PROCESS_INFORMATION pi = {sizeof(PROCESS_INFORMATION)};
	STARTUPINFO si = {sizeof(STARTUPINFO)};
	if(CreateProcess(NULL, pszCmdLine, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, pcszFolder, &si, &pi))
	{
		CloseHandle(pi.hThread);
		// Ждем завершения dwWaitTime секунд
		if(WaitForSingleObject(pi.hProcess, dwWaitTime *  1000 ) == WAIT_TIMEOUT)
		{
			// Не дождались - убиваем процесс
			TerminateProcess(pi.hProcess,  0 );
		}
		else
		{
			// Процесс успешно завершился
			lRet = TRUE;
		}
		CloseHandle(pi.hProcess);
	}
	return lRet;
}
...
Рейтинг: 0 / 0
Жив ли процесс?
    #34766171
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Однострочник можно сделать в юниксовом стиле:
if (system("ps|grep test.exe") == 0)
/* еще работает */

Dima TПроще только в том случае если процесс создан из приложения, которое его проверяет (т.е. есть хэндл этого процесса): WaitForSingleObject(hProcess, 0) Может подойти и такой вариант - можно из первого примера поиметь хендл и сохранить его для последующих опросов. Пока процесс запущен работать будет быстрее.
...
Рейтинг: 0 / 0
Жив ли процесс?
    #34767845
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в венде есть tasklist, который может проверять также статус завис/не завис
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Жив ли процесс?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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