Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.21;
Скачать: CL | DM;

Вниз

приостановить приложение   Найти похожие ветки 

 
Alex_win   (2002-10-10 10:09) [0]

Можно ли программно приостановить чужое приложение процесс (если у него существует такая функция), к примеру отключение AVP Монитора (в при вызове меню из системного реестра есть возможность отключить и включить приложение не выгружая/загружая его из памяти)?


 
Alex_win   (2002-10-10 10:10) [1]

и для Win98 тоже?


 
Nomad.kz   (2002-10-10 11:20) [2]

можно. В книге Джеффри Рихтера видел такое.


 
Nomad.kz   (2002-10-10 11:25) [3]

набрехал, оказывается, можно в 2000 написано, короче, читайте:

Приостановка и возобновление процессов
В Windows понятия "приостановка" и "возобновление" неприменимы к процессам, так как они не участвуют в распределении процессорного времени. Однако меня не рая спрашивали, как одним махом приостановить все потоки определенного процесса. Это можно сделать из другого процесса, причем он должен быть отладчиком и, в ча стности, вызывать функции вроде WaitForDebugEvent и ContinueDebugEvent.

Других способов приостановки всех потоков процесса в Windows нет: програм ма, выполняющая такую операцию, может "потерять" новые потоки. Система должна как-то приостанавливать в этот период не только все существующие, но и вновь со здаваемые потоки. Microsoft предпочла встроить эту функциональность в системный механизм отладки.

Вам, конечно, не удастся написать идеальную функцию SuspendProcess, но вполне по силам добиться ec удовлетворительной работы во многих ситуациях. Вот мой ва риант функции SuspendProcess.

{158}

VOID SuspendProcess(DWORD dwProcessID, BOOL tSuspend)
{

// получаем список потоков в системе
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwProcessID),

if (hSnapshot != INVALID_HANDLE_VALUE) {

// просматриваем список потоков
THREADENTRY32 te = { sizeof(te) };

BOOL fOk = Thread32First(hSnapshot, &te);

for (, fOk, fOk = Thread32Next(hSnapshot, &te))
{

// относится ли данный поток к нужному процессу
if (te.th320wnerProcessID == dwProcessID)
{

// пытаемся получить описатель потока по его идентификатору
HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te th32ThreadID);

if (hThread != NULL)
{

// приоcтанавливаем или возобновляем поток
if (fSuspend)
SuspendTh read(hThread);
else
ResumeThread(hThread);

}

CloseHandle(hThread);

}
}

CloseHandle(hSnapsnot);
}
}

Для перечисления списка потоков я использую ToolHelp функции (они рассмат ривались в главе 4). Определив потоки нужною процесса, я вызываю OpenThread.

HANDLE OpenThread( DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwThreadID);

Это новая функция, которая появилась в Windows 2000 Она находит объект ядра "поток" по идентификатору, указанному в dwTbreadJD, увеличивает его счетчик поль зователей на 1 и возвращает описатель объекта Получив описатель, я могу передать его в SuspendThread (или ResumeThread) OpenThread имеется только в Windows 2000, поэтому моя функция SuspendProcess не будет работать ни в Windows 95/98, ни в Windows NT 4 0

Вероятно, Вы уже догадались, почему SuspendProcess будет срабатывать не во всех случаях: при перечислении могут создавайся новые и уничтожаться существующие потоки. После вызова CreateToolhelp32Snapshot в процессе может появиться новый поток, который моя функция уже не увидит, а значит, и не приостановит Впослед ствии, когда я попытаюсь возобновить потоки, вновь вызвав SuspendProcess, она во

{159}

зобновит поток, который собственно и не приостанавливался. Но может быть еще хуже- при перечислении текущий поток уничтожается и создастся новый с тем же идентификатором. Тогда моя функция приостановит неизвестно какой поток (и даже непонятно в каком процессе).

Конечно, все эти ситуации крайне маловероятны, и, если Вы точно представляе те, что делает интересующий Вас процесс, никаких проблем не будет. В общем, ис пользуйте мою функцию на свой страх и риск.



Страницы: 1 вся ветка

Текущий архив: 2002.11.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
1-69247
123000
2002-11-11 18:18
2002.11.21
Блокировка файла


3-69169
Leonon
2002-10-31 15:59
2002.11.21
Знатокам SQL посвящается...


7-69587
-= ASPhalt =-
2002-07-23 12:31
2002.11.21
Mac адрес !


1-69415
den_c
2002-11-11 10:09
2002.11.21
Как сохранить в bmp файле содержимое TImage


1-69369
ec
2002-11-08 20:29
2002.11.21
аналог TStringList