Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Жив ли процесс? / 10 сообщений из 10, страница 1 из 1
30.08.2007, 12:20:14
    #34764132
x-a
x-a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жив ли процесс?
Как проверить, жив ли процесс с именем , например, "test.exe"?
...
Рейтинг: 0 / 0
30.08.2007, 12:32:31
    #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
30.08.2007, 12:36:38
    #34764212
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жив ли процесс?
> Как проверить, жив ли процесс с именем , например, "test.exe"?

С именем "test.exe" может быть не один процесс, тебе надо будет
подумать про это .
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
30.08.2007, 12:41:35
    #34764240
x-a
x-a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жив ли процесс?
Спасибо, но как-то это сложно...
По поводу того, что с таким именем может быть не один процесс, я это учитываю. Спасибо, что напомнили.
А не подойдет ли для этих целей функция
Код: plaintext
1.
2.
3.
4.
5.
HINSTANCE FindExecutable(      
    LPCTSTR lpFile,
    LPCTSTR lpDirectory,
    LPTSTR lpResult
);
???
...
Рейтинг: 0 / 0
30.08.2007, 13:09:01
    #34764369
x-a
x-a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жив ли процесс?
Нет, это не то... Эта ф-ция просто ищет файл... Ну должно же быть что-то!
...
Рейтинг: 0 / 0
30.08.2007, 13:24:14
    #34764432
x-a
x-a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жив ли процесс?
Всем спасибо. Я, похоже, нашла:
Код: plaintext
1.
2.
HMODULE WINAPI GetModuleHandle(
  LPCTSTR lpModuleName
);
:)
...
Рейтинг: 0 / 0
30.08.2007, 13:30:09
    #34764453
x-a
x-a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жив ли процесс?
Нет, извините, что поторопилась. Это то же не работает.. Неужели остается только то, что написал Cerebrum ?
...
Рейтинг: 0 / 0
30.08.2007, 16:51:46
    #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
30.08.2007, 22:25:41
    #34766171
teras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жив ли процесс?
Однострочник можно сделать в юниксовом стиле:
if (system("ps|grep test.exe") == 0)
/* еще работает */

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


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