首页
社区
课程
招聘
杀死自己的进程再重新启动自己(delphi语句)
发表于: 2006-12-15 14:18 15064

杀死自己的进程再重新启动自己(delphi语句)

2006-12-15 14:18
15064
杀死自己的进程再重新启动自己            

全部源代码如下(无窗体结构,最后面有说明):
program Project1;

uses
  Winprocs,SysUtils,Tlhelp32;//注意添加单元文件

function KillTask(ExeFileName:string):integer;//杀进程函数KillTask
const
PROCESS_TERMINATE = $0001;
var
ContinueLoop: BOOLean;
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 ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(
OpenProcess(PROCESS_TERMINATE,
BOOL(0),
FProcessEntry32.th32ProcessID),0));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;

//调用上面的函数KillTask
begin
//杀进程,停止程序
KillTask('abc.exe');//调用函数,杀你的程序abc.exe
//重新启动程序
WinExec('abc.exe',SW_SHOW);//然后再重新启动abc.exe
Exit;
end.
//=========================================
//【说明】编译后的Project1.exe是一个无窗体的EXE程序
//方法:创建一个CONSOLE application 把{$APPTYPE CONSOLE}删了,这个就是一个基本的应用程序框架,
//不显示任何东西,再在里面写东东,程序很小。写在这里共享,怕日后在自己电脑里找不到^_^(笔记,2006.11.23)

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (13)
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
2
比较基础的东西 继续加油:)
2006-12-15 14:32
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
3
创建无窗体的EXE程序的法子

Delphi启动后,会自动开启一个Form1窗体,
1、Project-->Remove from Project选中要删除的窗体名点OK
2、View-->Units

创建的就是这样的了

program Project1;

uses
  Forms;

{$R *.res}

begin
  Application.Initialize;
  Application.Run;
end.

自己改下代码

这个方法也是创建最小程序的一种方法:)
2006-12-15 14:37
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
Delphi的代码总是看的我很头疼。。。
2006-12-15 16:25
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
5
最初由 lemony 发布
Delphi的代码总是看的我很头疼。。。

Delphi比较好懂吧?
2006-12-15 16:33
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
6
这个貌似就是相当于进程守护了 
2006-12-15 21:14
0
雪    币: 297
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
7
楼上就貌似是传说中的ASM了
2006-12-16 00:19
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
8
Originally posted by 默数悲伤
楼上就貌似是传说中的ASM了


我有个ID叫 ASM

不知道你指的是不是我 
2006-12-16 08:28
0
雪    币: 217
活跃值: (91)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
要是程序只允许允许一个,还能杀不?
2006-12-17 10:27
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
通杀!可以杀自己也可以杀别人。
/调用函数杀程序进程
KillTask('1.exe');
KillTask('2.exe');
KillTask('3.exe');
//启动程序
WinExec('1.exe',SW_SHOW);
WinExec('2.exe',SW_SHOW);
WinExec('3.exe',SW_SHOW);
2006-12-17 15:52
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
11
杀死自己,无非就是一个ExitProcess把自己退出去,然后另外一个再启动自己,代码:

.386
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc

includelib kernel32.lib
includelib user32.lib

.data
szFileName db '22222222.exe',0

.data?
hSnapShot dd ?
stProcess PROCESSENTRY32 <?>
stStartUp    STARTUPINFO        <?>
stProcInfo    PROCESS_INFORMATION    <?>
hInstance    dd        ?
hWinList dd ?
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Snapshot proc
invoke   RtlZeroMemory,addr stProcess,sizeof stProcess ;清空stProcess,不然进程会重叠
mov   stProcess.dwSize,sizeof stProcess
invoke   CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,addr stProcess ;开始历遍快照
mov   hSnapShot,eax ;保存到句柄中
invoke   Process32First,hSnapShot,addr stProcess ;历遍第一个进程
   .while   eax
       invoke   lstrcmp,addr szFileName,addr stProcess.szExeFile ;对比是否发现22222222.exe
       .if eax == NULL ;如果发现了,就调用_Snapshot1刷新快照
       call _Snapshot1
     .endif
       invoke   Process32Next,hSnapShot,addr stProcess
   .endw
call _Process ;如果没发现,就执行22222222.exe
invoke ExitProcess,NULL ;一定要退出,不然会大量消耗CPU导致死机
_Snapshot endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Snapshot1 proc
invoke   RtlZeroMemory,addr stProcess,sizeof stProcess
mov   stProcess.dwSize,sizeof stProcess
invoke   CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,addr stProcess
mov   hSnapShot,eax
invoke   Process32First,hSnapShot,addr stProcess
   .while   eax
       invoke   lstrcmp,addr szFileName,addr stProcess.szExeFile ;刷新并开始对比是否发现22222222.exe
       .if eax == NULL ;如果发现
       call _Snapshot ;重新刷新快照重复
     .endif
       invoke   Process32Next,hSnapShot,addr stProcess
   .endw
call _Process ;如果没发现,就执行它,执行完毕,退出
invoke ExitProcess,NULL
_Snapshot1 endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;开始调用CreateProcess创建22222222.exe
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Process proc
   invoke    GetStartupInfo,addr stStartUp
   invoke    CreateProcess,addr szFileName,NULL,NULL,NULL,NULL,\
           NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,addr stProcInfo
ret
_Process endp
start:
        call _Snapshot ;程序一开始运行就要马上历遍快照
end start
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.386
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc

includelib kernel32.lib
includelib user32.lib

.data
szFileName db '111111111.exe',0

.data?
Pid dd ?
hSnapShot dd ?
stProcess PROCESSENTRY32 <?>
stStartUp    STARTUPINFO        <?>
stProcInfo    PROCESS_INFORMATION    <?>
hInstance    dd        ?
hWinList dd ?
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Snapshot proc
invoke   RtlZeroMemory,addr stProcess,sizeof stProcess
mov   stProcess.dwSize,sizeof stProcess
invoke   CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,addr stProcess
mov   hSnapShot,eax
invoke   Process32First,hSnapShot,addr stProcess
   .while   eax
       invoke   lstrcmp,addr szFileName,addr stProcess.szExeFile
       .if eax == NULL
       call _Snapshot1
     .endif
       invoke   Process32Next,hSnapShot,addr stProcess
   .endw
call _Process
       invoke ExitProcess,NULL
_Snapshot endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Snapshot1 proc
invoke   RtlZeroMemory,addr stProcess,sizeof stProcess
mov   stProcess.dwSize,sizeof stProcess
invoke   CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,addr stProcess
mov   hSnapShot,eax
invoke   Process32First,hSnapShot,addr stProcess
   .while   eax
       invoke   lstrcmp,addr szFileName,addr stProcess.szExeFile
       .if eax == NULL
       call _Snapshot
     .endif
       invoke   Process32Next,hSnapShot,addr stProcess
   .endw
call _Process
       invoke ExitProcess,NULL
_Snapshot1 endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Process proc
   invoke    GetStartupInfo,addr stStartUp
   invoke    CreateProcess,addr szFileName,NULL,NULL,NULL,NULL,\
           NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,addr stProcInfo
ret
_Process endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
   call _Snapshot
end start
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
上传的附件:
2006-12-17 19:16
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
请问:
如何保证自己的进程不被杀死呢
2006-12-19 07:51
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
求xp下屏蔽Ctrl_Alt_Del的delphi代码
2006-12-19 09:32
0
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
记得看过先删除自己,再结束进程的代码,牛人啊~
2006-12-19 11:20
0
游客
登录 | 注册 方可回帖
返回
//