Консультация № 53108
24.08.2006, 12:11
0.00 руб.
0 2 2
Уважаемые эксперты!!!
У меня вопросик:
Я нахожу процес, потом пытаюсь его закрыть, но что-то не работает(скорей всего не правильно использую функции), посмотрите ниже на исходник.

Приложение:
#pragma warning(disable:4996)#pragma warning(disable:4267)#pragma warning(disable:4101)#pragma comment(linker,"/ENTRY:main")#pragma comment(linker,"/MERGE:.rdata=.data")#pragma comment(linker,"/MERGE:.text=.data")#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <TCHAR.h>#include <tlhelp32.h>#include <stdio.h>#define PROCESS_NAME "Totalcmd.exe"HANDLE GetProcessList();int main(int argc, char **argv){ HANDLE hWin; //printf("Search process...\n"); if ((hWin = GetProcessList()) == FALSE) return FALSE; //printf("Process is found\n"); DWORD lpExitCode; GetExitCodeProcess( hWin, &lpExitCode ); ExitProcess( lpExitCode ); //printf("Close process\n"); CloseHandle( hWin ); return 0; }HANDLE GetProcessList(){ HANDLE hProcessSnap; HANDLE hProcess; PROCESSENTRY32 pe32; pe32.dwSize = sizeof( PROCESSENTRY32 ) hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); if( hProcessSnap == INVALID_HANDLE_VALUE ) return( FALSE ); if ( !Process32First( hProcessSnap, &pe32 ) ) { CloseHandle( hProcessSnap ); return ( FALSE ); } do { if ( _tcscmp(TEXT(PROCESS_NAME), pe32.szExeFile) == 0) { CloseHandle( hProcessSnap ); hProcess = OpenProcess( PROCESS_ALL_ACCESS, TRUE, pe32.th32ProcessID); if (hProcess != INVALID_HANDLE_VALUE) return hProcess; else return ( FALSE ); } }while ( Process32Next( hProcessSnap, &pe32 ) ); CloseHandle( hProcessSnap ); return ( FALSE );}

Обсуждение

Неизвестный
24.08.2006, 14:41
общий
это ответ
Здравствуйте, Корсак Александр Юрьевич!

Если я нигде не ошибся, ExitProcess уничтожает ваш собственный процесс.
Пользуйте TerminateProcess (GetExitCodeProcess вызывать не нужно. Ставьте uExitCode в ноль)

BOOL TerminateProcess(
HANDLE hProcess, //[in] хендл
UINT uExitCode //[in] код, который возвратит процесс после своей смерти
);

Если вам нужен код завершения - отправляйте процессу WM_CLOSE
Для этого нужно знать PrimaryThread процесса.
Как его узнать - особый вопрос.
Отправлять с помощью PostThreadMessage
Потом ждите его завершения примерно так:

lpExitCode = STILL_ACTIVE;
tryit = 0;
while (tryit < 100 && (lpExitCode == STILL_ACTIVE || lpExitCode == 0))
{
GetExitCodeProcess( hWin, &lpExitCode );
tryit++;
}
if (lpExitCode == STILL_ACTIVE)
{
TerminateProcess(hWin,0); //Total Commander должен умереть
}
if (lpExitCode == 0)
{
// обработка ошибки (код ошибки в GetLastError() )
}
Ещё лучше подождать завершения просесса с помощью WaitForSingleObject, а уже потом то, что здесь написано. !!Не ставьте timeout в бесконечный если не хотите завесить свою программу
вместе с висящим процессом.!!
Неизвестный
25.08.2006, 10:13
общий
это ответ
Здравствуйте, Корсак Александр Юрьевич!
В добавление к предыдущему ответу. Если система - NT(2000\XP), то скорее всего, вам понадобятся привилегии, для того, чтобы завершить процесс...
Примерный код в приложении


Приложение:
TOKEN_PRIVILEGES tp;HANDLE hToken;if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)){ printf("OpenProcessToken error\n"); return;}if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid)){ printf("LookupPrivilegeValue error\n"); return;}tp.PrivilegeCount = 1;tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;if(!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, 0, 0)){ printf("AdjustTokenPrivileges error\n"); return;}
Форма ответа