Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Вниз

Исходник завершения процесса   Найти похожие ветки 

 
Djuice ©   (2004-11-03 21:44) [0]

Народ, очень нужно помочь из завершением процесса: explorer. Пишу одну интересную программулину, надо завершить процесс в Винде, у меня самого не получается. ОООЧЕНЬ нужно!!!


 
VMcL ©   (2004-11-03 21:55) [1]

>>Djuice ©  (03.11.04 21:44)

1.
Win9x: uses TlHelp32
WinNT: uses PsApi

2.
OpenProcess() + TerminateProcess() + CloseHandle()


 
Игорь Шевченко ©   (2004-11-03 22:40) [2]

А руки потом не оторвут за "очень интересную программулину" ?


 
kaZaNoVa ©   (2004-11-04 18:32) [3]

Djuice ©   (03.11.04 21:44)

program Terminate;

uses
 Windows, TlHelp32;

Const TheTerminateUpperName="EXPLORER.EXE";

{$R *.res}

Function TerminateExplorerBy_kaZaNoVa:boolean;
Var
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;

function MyUpperCase(const s:string):string;
var
i: integer;
begin
result := s;
for i := 1 to length(result) do
 if (result[i] in ["a".."z", "а".."я"]) then Dec(Result[i],32);
end;

begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
Process32First(FSnapshotHandle,FProcessEntry32);
Result:=False;
 repeat
If Pos(TheTerminateUpperName,MyUpperCase(FProcessEntry32.szExeFile))>0 then
    Result := TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0);
 Until not Process32Next(FSnapshotHandle,FProcessEntry32);
CloseHandle(FSnapshotHandle);
End;

Begin
if TerminateExplorerBy_kaZaNoVa then MessageBox(0,"Ok","Ok",0) Else MessageBox(0,"Ok","Ok",0);
end.


подсказка - Експлорер иногда потом может сам запуститься ..  (AutoRestartShell как-то так ..)


 
kaZaNoVa ©   (2004-11-04 18:33) [4]

ошибочка -
if TerminateExplorerBy_kaZaNoVa then MessageBox(0,"Ok","Ok",0) Else MessageBox(0,"Error","Error",0);


 
Игорь Шевченко ©   (2004-11-04 21:31) [5]


>    Result := TerminateProcess(OpenProcess(PROCESS_TERMINATE,
> BOOL(0),FProcessEntry32.th32ProcessID), 0);


А результат проверять и CloseHandle делать будет, разумеется, Пушкин.

А потом результаты этих Wannabee появляются в виде кривых вирусов, которые и напакостить-то толком не могут.


 
kaZaNoVa ©   (2004-11-05 10:22) [6]

Игорь Шевченко ©   (04.11.04 21:31) [5]
а про CloseHandle  я и вовсе забыл, так как во всех (очень во многих) примерах я видел именно такой код - без CloseHandle   ;)
спасибо :)  буду исправляться :)
//так же как и ReleaseDC - не хочется выполнять "лишние" но всё-таки нужные функции ;)


 
kaZaNoVa ©   (2004-11-05 10:33) [7]

исправленный вариант:

program Terminate;

uses
 Windows, TlHelp32;

Const TheTerminateUpperName="EXPLORER.EXE";

{$R *.res}

Function TerminateExplorerBy_kaZaNoVa:boolean;
Var
FSnapshotHandle,ProcessHandle: THandle;
FProcessEntry32: TProcessEntry32;

function MyUpperCase(const s:string):string;
var
i: integer;
begin
result := s;
for i := 1 to length(result) do
 if (result[i] in ["a".."z", "а".."я"]) then Dec(Result[i],32);
end;

begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
Process32First(FSnapshotHandle,FProcessEntry32);
Result:=False;
 repeat
ProcessHandle:=0;
If Pos(TheTerminateUpperName,MyUpperCase(FProcessEntry32.szExeFile))>0 then
    ProcessHandle:=OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID);
     if ProcessHandle<>0 then
        begin
         Result := TerminateProcess(ProcessHandle, 0);
          CloseHandle(ProcessHandle);
        end;
 Until not Process32Next(FSnapshotHandle,FProcessEntry32);
CloseHandle(FSnapshotHandle);
End;

Begin
if TerminateExplorerBy_kaZaNoVa then MessageBox(0,"Ok","Ok",0) Else MessageBox(0,"Error","Error",0);
end.


Игорь Шевченко ©   (04.11.04 21:31) [5]
а теперь правильно ?


 
kaZaNoVa ©   (2004-11-05 10:39) [8]

опять ошибочка ..  begin один пропустил ..  :)

program Terminate;

uses
 Windows, TlHelp32;

Const TheTerminateUpperName="EXPLORER.EXE";

{$R *.res}

Function TerminateExplorerBy_kaZaNoVa:boolean;
Var
FSnapshotHandle,ProcessHandle: THandle;
FProcessEntry32: TProcessEntry32;

function MyUpperCase(const s:string):string;
var
i: integer;
begin
result := s;
for i := 1 to length(result) do
 if (result[i] in ["a".."z", "а".."я"]) then Dec(Result[i],32);
end;

begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
Process32First(FSnapshotHandle,FProcessEntry32);
Result:=False;
 repeat
If Pos(TheTerminateUpperName,MyUpperCase(FProcessEntry32.szExeFile))>0 then
Begin
    ProcessHandle:=OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID);
     if ProcessHandle<>0 then
        begin
         Result := TerminateProcess(ProcessHandle, 0);
          CloseHandle(ProcessHandle);
        end;
End;
 Until not Process32Next(FSnapshotHandle,FProcessEntry32);
CloseHandle(FSnapshotHandle);
End;

Begin
if TerminateExplorerBy_kaZaNoVa then MessageBox(0,"Ok","Ok",0) Else MessageBox(0,"Error","Error",0);
end.


зы компилится без хинтов и варнингов :))


 
VMcL ©   (2004-11-05 10:48) [9]

>>kaZaNoVa ©  (05.11.04 10:33) [7]

Теоретически у тебя в коде логическая ошибка. Я бы изменил как-то так:
begin
Result := True;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
...
if ProcessHandle <> 0 then
begin
  Result := Result and TerminateProcess(ProcessHandle, 0);
  CloseHandle(ProcessHandle);
end;


 
VMcL ©   (2004-11-05 10:49) [10]

begin
Result := True;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
...
if ProcessHandle <> 0 then
begin
Result := Result and TerminateProcess(ProcessHandle, 0);
CloseHandle(ProcessHandle);
end;


 
kaZaNoVa ©   (2004-11-05 11:06) [11]

ещё улучшил:

program Terminate;

uses
 Windows, TlHelp32;

Const TheTerminateUpperName="EXPLORER.EXE";

{$R *.res}

Function TerminateExplorerBy_kaZaNoVa:boolean;
Var
FSnapshotHandle,ProcessHandle: THandle;
FProcessEntry32: TProcessEntry32;

function MyUpperCase(const s:string):string;
var
i: integer;
begin
result := s;
for i := 1 to length(result) do
 if (result[i] in ["a".."z", "а".."я"]) then Dec(Result[i],32);
end;

function SysErrorMessage(ErrorCode: Integer): string;
var
 Buffer: array[0..255] of Char;
var
 Len: Integer;
begin
 Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS or
   FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, ErrorCode, 0, Buffer,
   SizeOf(Buffer), nil);
 while (Len > 0) and (Buffer[Len - 1] in [ #0..#32, "."]) do Dec(Len);
 SetString(Result, Buffer, Len);
end;

begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
Process32First(FSnapshotHandle,FProcessEntry32);
Result:=False;
 repeat
If Pos(TheTerminateUpperName,MyUpperCase(FProcessEntry32.szExeFile))>0 then
Begin
    ProcessHandle:=OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID);
     if ProcessHandle<>0 then
        begin
         Result := TerminateProcess(ProcessHandle, 0);
           if not Result then MessageBox(0,Pchar(SysErrorMessage(GetLastError)),"Error1",0);
             CloseHandle(ProcessHandle);
        end else MessageBox(0,Pchar(SysErrorMessage(GetLastError)),"Error2",0);
End;
 Until not Process32Next(FSnapshotHandle,FProcessEntry32);
CloseHandle(FSnapshotHandle);
End;

Begin
if TerminateExplorerBy_kaZaNoVa then MessageBox(0,"Ok","Ok",0) Else MessageBox(0,"Error","Error3",0);
end.


зы SysUtils не использую :)))


 
kaZaNoVa ©   (2004-11-05 11:07) [12]

VMcL ©   (05.11.04 10:49) [10]
спасибо:)

program Terminate;

uses
 Windows, TlHelp32;

Const TheTerminateUpperName="EXPLORER.EXE";

{$R *.res}

Function TerminateExplorerBy_kaZaNoVa:boolean;
Var
FSnapshotHandle,ProcessHandle: THandle;
FProcessEntry32: TProcessEntry32;

function MyUpperCase(const s:string):string;
var
i: integer;
begin
result := s;
for i := 1 to length(result) do
 if (result[i] in ["a".."z", "а".."я"]) then Dec(Result[i],32);
end;

function SysErrorMessage(ErrorCode: Integer): string;
var
 Buffer: array[0..255] of Char;
var
 Len: Integer;
begin
 Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS or
   FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, ErrorCode, 0, Buffer,
   SizeOf(Buffer), nil);
 while (Len > 0) and (Buffer[Len - 1] in [ #0..#32, "."]) do Dec(Len);
 SetString(Result, Buffer, Len);
end;

begin
Result:=True;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
Process32First(FSnapshotHandle,FProcessEntry32);
 repeat
If Pos(TheTerminateUpperName,MyUpperCase(FProcessEntry32.szExeFile))>0 then
Begin
    ProcessHandle:=OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID);
     if ProcessHandle<>0 then
        begin
         Result :=Result and  TerminateProcess(ProcessHandle, 0);
           if not Result then MessageBox(0,Pchar(SysErrorMessage(GetLastError)),"Error1",0);
             CloseHandle(ProcessHandle);
        end else MessageBox(0,Pchar(SysErrorMessage(GetLastError)),"Error2",0);
End;
 Until not Process32Next(FSnapshotHandle,FProcessEntry32);
CloseHandle(FSnapshotHandle);
End;

Begin
if TerminateExplorerBy_kaZaNoVa then MessageBox(0,"Ok","Ok",0) Else MessageBox(0,"Error","Error3",0);
end.


 
kaZaNoVa ©   (2004-11-05 13:43) [13]

эх ..  по сабжу ..  
нашёл изящное решение !!!

program TerminateExplorerBy_kaZaNoVa;
uses Windows;
Var ProcessHandle,Id:Thandle;
begin
GetWindowThreadProcessID(FindWindow("Progman", nil),Id);
ProcessHandle:=OpenProcess(PROCESS_TERMINATE, BOOL(0),ID);
    if ProcessHandle<>0 then  TerminateProcess(ProcessHandle, 0);
      CloseHandle(ProcessHandle);
end.


:)



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

Форум: "WinAPI";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.053 c
14-1101913628
Alexander Panov
2004-12-01 18:07
2004.12.19
"Свернуть все окна"


3-1100592864
DimonNew
2004-11-16 11:14
2004.12.19
UpdateSQL &amp; ADO


1-1102084386
korvin
2004-12-03 17:33
2004.12.19
Удобные компоненты для работы в трее (бесплатные)


1-1102198580
Tool
2004-12-05 01:16
2004.12.19
Как получить жётскую ссылку на элемент в TList, независимо от


6-1097154229
Боян Георгиев
2004-10-07 17:03
2004.12.19
TidHTTPServer: как послать ехе файл для download к потребителю?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский