[分享]结束进程---举IE为例

hygougou 2004-12-15 07:47:26
//创建非可视对象uf_get_exename

//声明local external function(api)
Function Long CreateToolhelp32Snapshot(Long Flags,Long ProcessId) Library "kernel32.dll"
Function Integer Process32First(uLong Snapshot,ref s_Process Process) Library "kernel32.dll"
Function Integer Process32Next(uLong Snapshot,ref s_Process Process) Library "kernel32.dll"

//声明前先创建结构
unsignedlong structsize
unsignedlong usage
unsignedlong processid
unsignedlong defaultheapid
unsignedlong moduleid
unsignedlong threads
unsignedlong parentprocessid
unsignedlong classbase
unsignedlong flags
character filename[260]
//构造对象uf_get_exename的函数of_getexe()

///////////////////////////of_getexe()////////////////////////
功能:枚举进程并返回指定进程号PID
传入:无
返回:Long
/////////////////////////////////////////////////////////////

s_Process lst_Process
string ls_filename[100] ,ls_curexename
ulong ln_ProcessID,ln_SameCount,ln_Snapshot,ln_Circle,ln_Count,ul_PID

ul_PID = 0
ln_Snapshot = CreateToolhelp32Snapshot(2,0)
if (ln_Snapshot<1) then return 0
lst_Process.StructSize = 296

if Process32First(ln_Snapshot,lst_Process)=0 then return 0

//枚举当前权限下的进程
debugbreak()
do while true

if Process32Next(ln_Snapshot,lst_Process)=0 then exit
ln_Count = ln_Count + 1
ls_FileName[ln_Count] = lst_Process.FileName
If Lower(ls_FileName[ln_Count]) = 'iexplore.exe' Then
//取得进程号
ul_PID = lst_Process.ProcessID
//messagebox(string(ul_PID),ls_FileName[ln_Count])
End If

loop

return ul_PID

//接下来
//创建一个窗体,上面放一按钮cb_click

//在窗体声明local external function(api)
FUNCTION ulong TerminateProcess(ulong hProcess,ulong uExitCode) LIBRARY "kernel32.dll"
FUNCTION ulong OpenProcess(ulong dwDesiredAccess,ulong bInheritHandle,ulong dwProcessId) LIBRARY "kernel32.dll"

//cb_click的clicked事件

uf_get_exename luf_get_exename


INTEGER li_rc
ULONG ul_PID
ULONG PROCESS_TERMINATE = 0001
ULONG hwdprocess

If messagebox('结束进程','确定吗?Kill?',question!,yesno!,1) = 2 Then return

//创建实例变量
luf_get_exename = create uf_get_exename
//获取指定进程号
ul_PID = luf_get_exename.of_getexe()

If ul_PID = 0 Then
Messagebox('结束进程','没有发现IE进程!')
return
End If

If ul_PID <> 0 Then
//获取指定进程号的进程句柄
hwdprocess = OpenProcess(PROCESS_TERMINATE,1,ul_PID)
//messagebox('',string(hwdprocess))
//结束进程,成功返回非零
li_rc = TerminateProcess(hwdprocess,0)
If li_rc <> 0 Then Messagebox('结束进程','成功结束进程!')
End If


Destroy luf_get_exename;
...全文
398 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
anglequhongmei 2005-03-23
  • 打赏
  • 举报
回复
EnumProcess,不是api函数,怎么引用,我还没有用过这种的哟.
我使用debugbreak() 已经其中api的时候pb都自动退出了,出现经常遇到的sybase product 遇到错误,等等,是否发送等等的.
balloonman2002 2004-12-29
  • 打赏
  • 举报
回复
狗狗,请将本贴揭贴,以便能将其加入FAQ,造福大家,:)
lnasp 2004-12-21
  • 打赏
  • 举报
回复
问题:
谢谢兄台的帮助
但是 为什么只能关闭当前窗口 而不是全部?不懂!
handi 2004-12-19
  • 打赏
  • 举报
回复
pb杂志投稿信箱: emag_pb@csdn.net

VeryOldMan 2004-12-19
  • 打赏
  • 举报
回复
haha

thanks!
mnsiii 2004-12-15
  • 打赏
  • 举报
回复
厉害!学习
hygougou 2004-12-15
  • 打赏
  • 举报
回复
呵呵~~~需要出力的地方鄙人一定尽力~~~,也需要多向众多星将们多多学习,我不懂的还很多哦:)
hygougou 2004-12-15
  • 打赏
  • 举报
回复
向开源学习,共享~~
balloonman2002 2004-12-15
  • 打赏
  • 举报
回复
不错,楼主,建议加到PB电子期刊,另外建议楼主加入PB电子期刊的编辑队伍,:)
hygougou 2004-12-15
  • 打赏
  • 举报
回复
补充:
1、进程相当于系统提供的一个平台,它可以包括一个或多个线程,如IE是个进程,
打开多个网页是它的多个线程,把IE进程Kill掉即可关闭多个打开网页的线程。
2、98和NT不一样。98下可以用CreateToolhelp32Snapshot函数Process32First和
Process32Next来枚举当前所有进程的进程ID(先调用函数CreateToolhelp32Snapshot)
NT下用EnumProcesses函数来枚举。2000是支持CreateToolhelp32Snapshot函数的。
得到进程ID后就可以用OpenProcess函数得到句柄了,在NT和2000下要通过安全检测。
3、EnumProcess 也可以得到系统中的进程列表
杀掉本地进程其实很简单,取得进程ID后,调用OpenProcess函数打开进程句柄,然
后调用TerminateProcess函数就可以杀掉进程了。有些情况下并不能直接打开进程句柄,
例如WINLOGON等系统进程,因为权限不够。这个时候我们就得先提升自己的进程的权限了。
提升权限过程也不复杂,先调用GetCurrentProcess函数取得当前进程的句柄,然后调用
OpenProcessToken打开当前进程的访问令牌,接着调用LookupPrivilegeValue函数取得你
想提升的权限的值,最后调用AdjustTokenPrivileges函数给当前进程的访问令牌增加权限
就可以了。一般有了SeDebugPrivilege特权后,就可以杀掉除Idle外的所有进程了。

680

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder API 调用
社区管理员
  • API 调用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧