Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2007, 10:35   #1
Shurik Hacker
Проги на заказ
Пользователь
 
Аватар для Shurik Hacker
 
Регистрация: 22.05.2007
Сообщений: 41
По умолчанию Остановить процесс

В ArtMoney есть 2 классные функции:
-Остановить процесс
-Продолжить процесс
Как мне их реализовать в Delphi.
Может быть есть знающие люди???
Делфист - это звучит гордо!
Shurik Hacker вне форума Ответить с цитированием
Старый 17.07.2007, 10:52   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

не совсем остановить.
Процессу назначается приоритет idle , затем (при восстановлении) назначается приоритет normal

SetPriorityClass(hProcess, dwPriorityClass)

если из самого приложения себе приоритет устанавливать, то hProcess:=Àpplication.Handle;

dwPriorityClass одно из значений:

HIGH_PRIORITY_CLASS
IDLE_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 17.07.2007, 20:31   #3
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

есть класные Native API функции
ZwSuspendProcess
ZwResumeProcess;

функции
остановка
Код:
procedure _SuspendProcess(ProcessID:DWORD);
var
  hProcess:THandle;
  OA:TObjectAttributes;
  CID:TClientID;
  res:DWORD;
begin
  ZeroMemory(@OA,sizeof(OA));
  CID.UniqueThread:=0;
  CID.UniqueProcess:=ProcessID;
  hProcess:=0;
  RES:=ZwOpenProcess(@hProcess,PROCESS_ALL_ACCESS,@OA,@CID);
  ZwSuspendProcess(hProcess);
  CloseHandle(hProcess);
end;
продолжение
Код:
procedure  _ResumeProcess(ProcessID:DWORD);
var hProcess:THandle;
    OA:TObjectAttributes;
    CID:TClientID;
begin
  ZeroMemory(@OA,sizeof(OA));
  CID.UniqueThread:=0;
  CID.UniqueProcess:=ProcessID;
  hProcess:=0;
  ZwOpenProcess(@hProcess,PROCESS_ALL_ACCESS,@OA,@CID);
  ZwResumeProcess(hProcess);
  CloseHandle(hProcess);
end;
потребуется
Код:
  
  NTStatus = cardinal;

  PObjectAttributes = ^TObjectAttributes;
  TObjectAttributes = packed record
    Length: DWORD;
    RootDirectory: THandle;
    ObjectName: PUnicodeString;
    Attributes: DWORD;
    SecurityDescriptor: Pointer;
    SecurityQualityOfService: Pointer;
  end;
  PClientID = ^TClientID;
  TClientID = packed record
    UniqueProcess:cardinal;
    UniqueThread:cardinal;
  end;

Function ZwOpenProcess(phProces: PDWORD; AccessMask:DWORD;
                       ObjectAttributes: PObjectAttributes;
                       ClientID: PClientID): NTStatus; stdcall; external 'ntdll.dll';
Function ZwSuspendProcess(ProcessHandle: THandle): NTStatus;
                           stdcall; external 'ntdll.dll';
Function ZwResumeProcess(ProcessHandle: THandle): NTStatus;
                         stdcall; external 'ntdll.dll';
всё вроде....
rpy3uH вне форума Ответить с цитированием
Старый 18.07.2007, 20:09   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

чуть не забыл:

Код:
  PUnicodeString = ^TUnicodeString;
  TUnicodeString = packed record
    Length: Word;
    MaximumLength: Word;
    Buffer: PWideChar;
  end;
но я зачем-то намудрил с native api, можно проще, с помошью API
Код:
uses ...,tlhelp32,....
.....
const
 THREAD_SUSPEND_RESUME  = $00000002;

{$R *.dfm}
Function OpenThread(dwDesiredAccess: dword; bInheritHandle: bool;
  dwThreadId: dword): dword; stdcall; external 'kernel32.dll';

function GetProcessID(ProcessName:string):DWORD;
var
 Snap: dword;
 Process: TPROCESSENTRY32;
begin    
  Result := 0;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Snap <> INVALID_HANDLE_VALUE then
     begin
      Process.dwSize := SizeOf(TPROCESSENTRY32);
      if Process32First(Snap, Process) then
         repeat
          if lstrcmpi(Process.szExeFile, pchar(ProcessName)) = 0 then
             begin
              Result := Process.th32ProcessID;
              CloseHandle(Snap);
              Exit;
             end;
         until not Process32Next(Snap, Process);
      Result := 0;
      CloseHandle(Snap);
     end;
end;

procedure SuspendProcess(ProcessID:DWORD);
var
  ThreadsSnapshot:THandle;
  ThreadRecord:TThreadEntry32;
  ThreadHandle: THandle;
begin
  ThreadsSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
  ThreadRecord.dwSize:=sizeof(ThreadRecord);
  if Thread32First(ThreadsSnapshot,ThreadRecord) then
   begin //n 101
    repeat
     if ThreadRecord.th32OwnerProcessID=ProcessID then
      begin
       ThreadHandle:=OpenThread(THREAD_SUSPEND_RESUME,False,ThreadRecord.th32ThreadID);
       if ThreadHandle=0 then Exit;
       SuspendThread(ThreadHandle);
       CloseHandle(ThreadHandle);
      end;
    until not Thread32Next(ThreadsSnapshot,ThreadRecord);
   end;  //k 101
  CloseHandle(ThreadsSnapshot);
end;

procedure ResumeProcess(ProcessID:DWORD);
var
  ThreadsSnapshot:THandle;
  ThreadRecord:TThreadEntry32;
  ThreadHandle: THandle;
begin
  ThreadsSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
  ThreadRecord.dwSize:=sizeof(ThreadRecord);
  if Thread32First(ThreadsSnapshot,ThreadRecord) then
   begin //n 101
    repeat
     if ThreadRecord.th32OwnerProcessID=ProcessID then
      begin
       ThreadHandle:=OpenThread(THREAD_SUSPEND_RESUME,False,ThreadRecord.th32ThreadID);
       if ThreadHandle=0 then Exit;
       ResumeThread(ThreadHandle);
       CloseHandle(ThreadHandle);
      end;
    until not Thread32Next(ThreadsSnapshot,ThreadRecord);
   end;  //k 101
  CloseHandle(ThreadsSnapshot);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SuspendProcess(GetProcessID(Edit1.Text));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ResumeProcess(GetProcessID(Edit1.Text));
end;
rpy3uH вне форума Ответить с цитированием
Старый 20.07.2007, 08:05   #5
Shurik Hacker
Проги на заказ
Пользователь
 
Аватар для Shurik Hacker
 
Регистрация: 22.05.2007
Сообщений: 41
По умолчанию

Всем огромное спасибо!!!
Особенно rpy3uH'у, шустрый малый, везде успел!!!
Делфист - это звучит гордо!
Shurik Hacker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как остановить процедуру ADOStoredProc с установленным ExecuteOptions:=[eoAsyncExecute]; Иванчо БД в Delphi 3 30.05.2012 13:43
Как остановить поток? Никки Win Api 3 06.12.2007 22:04
Как остановить цикл без Application.ProcessMessages Alar Общие вопросы Delphi 0 29.10.2006 20:18
как корректно остановить цикл. Alar Общие вопросы Delphi 0 29.10.2006 10:42