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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2011, 00:50   #1
logitech12
Пользователь
 
Регистрация: 07.04.2011
Сообщений: 44
По умолчанию Заморозка процесса (в чем ошибка?)

Код:
var
  Form10: TForm10;
  c:dword;

const
 THREAD_SUSPEND_RESUME  = $00000002;

implementation

{$R *.dfm}

Function OpenThread(dwDesiredAccess: dword; bInheritHandle: bool;
  dwThreadId: dword): dword; stdcall; external 'kernel32.dll';


function GetProcessPID(process: string): Cardinal;
var
  ContinueLoop: Bool;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.DwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  while Integer(ContinueLoop) <> 0 do
  begin
    if ((AnsiUpperCase(ExtractFileName(FProcessEntry32.SzExeFile)) =
      AnsiUpperCase('process.exe')) or (AnsiUpperCase(FProcessEntry32.SzExeFile) =
      AnsiUpperCase('process.exe'))) then
      Result := FProcessEntry32.Th32ProcessID;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
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 TForm10.Button3Click(Sender: TObject);
begin

c:=GetProcessPid('process.exe');
edit1.text:=InttoStr(c);

end;

procedure TForm10.Button1Click(Sender: TObject);

begin
SuspendProcess(GetProcessID(strtoint(Edit1.Text)));
end;

procedure TForm10.Button2Click(Sender: TObject);
begin
ResumeProcess(GetProcessID(strtoint(Edit1.Text)));
end;


end.
вот что выдает при запуске



надеюсь на Вашу помощь

Последний раз редактировалось logitech12; 14.05.2011 в 01:42.
logitech12 вне форума Ответить с цитированием
Старый 14.05.2011, 01:51   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Код:
      AnsiUpperCase('process.exe')) or (AnsiUpperCase(FProcessEntry32.SzExeFile) =
      AnsiUpperCase('process.exe'))) then


Вы вообще понимаете что вы пишите?
я вам скинул готовую функцию, а вы её в добавок за чем-то изменили и притом так, что она будет возвращать 0 всегда.

А ошибка наверное в том что, либо OpenThread не правильно экспоритируется, либо в ней не все параметры.
Проверить не сложно:

Код:
type 
  TCallFunc = function (aD:DWORD; aB:BOOL):DWORD;

var
  DLLh:cardinal;
  Func:TcallFunc;
begin
  DLLh:=SafeLoadLibrary('kernel32.dll');
  If DLLh <> 0 then
  begin
  @CallFunc:=GetProcAddress(DLLh,'OpenThread');
  If assigned(@CallFunc) then
  ShowMessage('OpenThread function exists')
  else
  ShowMessage('OpenThread function not found');
  end else
  ShowMessage('Беблиотека не загружена.');
end;
Гуглите MSDN и пару книг по синтаксису Паскаля и азам Delphi.
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заморозка и возобновление процесса logitech12 Общие вопросы Delphi 10 13.05.2011 22:56
Заморозка процесса RuVarez Общие вопросы Delphi 12 03.09.2010 11:31
Запуск процесса в потоке, завершение процесса в указааноое время, Дайте совет Человек_Борща Общие вопросы Delphi 3 29.08.2010 12:58
Страшная ошибка при создании процесса nazavrik Общие вопросы C/C++ 3 03.10.2009 01:17
Заморозка проги wwww Общие вопросы Delphi 3 09.10.2007 09:36