terminateprocess?TerminateProcess使用方法
各位朋友,你是否对terminateprocess和TerminateProcess使用方法的相关问题感到好奇?别担心,我将为你揭示这些问题的答案,帮助你更好地理解和应用这些知识。让我们一起探索吧!
TerminateProcess使用方法
在win7上,VS2010开发环境中,写一个守护进程的程序,程序内容:发现目标进程挂起后,将其kill,然后重启。可是,遇到了一个问题,就是在使用TerminateProcess进行kill目标进程时,kill失败,利用GetLastError()获取错误代码为5,“5”表示拒绝访问。
有2中解决方法:
方法1:获取管理员权限。
在应用程序的Manifest禁用UAC Virtualization,取消其对数据写操作的重定向。具体做法:项目--》***属性--》连接器--》清单文件,我们设置启用UAC(Enable User Account Control),并且在UAC Execution Level中设置请求管理员权限。这样,应用程序在启动的时候,就会向用户请求管理员权限,当应用程序获得管理员执行权限后,当然可以向任意目录写入数据,UAC Virtualization也就不会起作用了。
方法2:在OpenProcess的时候权限设置的不对。
原因是OpenProcess是设置的权限不够,应该加上PROCESS_TERMINATE权限,具体可参考MSDN中的OpenProcess函数的说明。
将参数DWORDexitCode设置成PROCESS_ALL权限即可使用。
TerminateProcess结束进程的具体代码如下:
--------------------------------------------------------------------------
HANDLE hProcess= OpenProcess(PROCESS_ALL_ACCESS,FALSE,processID);
TerminateProcess(hProcess,uExitCode);
--------------------------------------------------------------------------
为什么TerminateProcess不能结束进程解决思路
STARTUPINFO StartupInfo;//定义STARTUPINFO结构指针 memset(&StartupInfo,0,sizeof(STARTUPINFO)); StartupInfo.cb= sizeof(STARTUPINFO); StartupInfo.dwFlags=STARTF_USESHOWWINDOW; StartupInfo.wShowWindow=SW_SHOW; PROCESS_INFORMATION ProcessInfo; if(!CreateProcess("D:\\Program Files\\Fluent.Inc\\ntbin\\ntx86\\gambit.exe", cmdline.GetBuffer(cmdline.GetLength()),NULL,NULL,FALSE,0,NULL,"E:\\zuoye\\gambit1",&StartupInfo,&ProcessInfo)){cout<<"Create Fail!"<<endl;exit(1);}else{cout<<"Success!"<<endl;} WaitForSingleObject(ProcessInfo.hProcess,INFINITE);}void main(){gambit();HANDLE han=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//取进程快照 PROCESSENTRY32 lpp; lpp.dwSize=sizeof(PROCESSENTRY32);BOOL bo;bo=Process32First(han,&lpp);//从快照里取第一个进程信息 TCHAR*str1;while(bo){str1=lpp.szExeFile; if(!strcmp(str1,"exceed.exe")||!strcmp(str1,"gambit.exe")){HANDLE han2=OpenProcess(1,TRUE,lpp.th32ProcessID);//取进程实例 PROCESS_TERMINATE//cout<<str; TerminateProcess(han2,0);//关闭}bo=Process32Next(han,&lpp);//取下一个进程信息}CloseHandle(han);------解决方案--------------------------------------------------------TerminateProcess结束进程是不安全的。这个进程最好没有带锁的资源。而你的这个里面好像用到了cout,虽然我不知道这个到底是否有没有锁,但是这个cout肯定是互斥的。这样就有可能导致了结束进程失败------解决方案--------------------------------------------------------先确定有没有执行到TerminateProcess------解决方案--------------------------------------------------------既然是windows平台,那就用system调用相关的命令吧, system执行下面的命令,绝大部分进程都能结束,方便实用。
VB怎么用TerminateProcess关闭进程
Private Declare Function FindWindow Lib"user32" Alias"FindWindowA"(ByVal lpclassname As String, ByVal lpwindowname As String) As Long'查找窗口句柄 Private Sub Command1_Click() Dim a As Long a= OpenProcess(&H1F0FFF, False,进程ID) TerminateProcess(a, 0) CloseHandle aEnd Sub补充:代码有点多,弄得有点乱了知道PID的话,查找窗口句柄那个可以去了 Private Declare Function CloseHandle Lib"kernel32"(ByVal hObject As Long) As Long'关闭进程 Private Declare Function OpenProcess Lib"kernel32"(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long'打开进程ID Private Const PROCESS_ALL_ACCESS As Long=&H1F0FFF'最大权限打开进程 Private Declare Function GetWindowThreadProcessId Lib"user32"(ByVal hwnd As Long, lpdwProcessId As Long) As Long'获取PID Private Declare Function TerminateProcess Lib"kernel32"(ByVal hProcess As Long, ByVal uExitCode As Long) As Long'结束进程ID Private Sub Command1_Click() Dim a As Long, b As Long, c As Long a= FindWindow(vbNullString,"abc.exe") GetWindowThreadProcessId a, b c= OpenProcess(&H1F0FFF, False, b) TerminateProcess c, 0 CloseHandle cEnd Sub重新写了个,跟据你的意思来的,我的自己简化了,省了好多代码,你看不明白。补充:思路是这样的,先找窗口取得句柄(findwindow),然后通过句柄取得PID(GetWindowThreadProcessId),然后通过PID打开进程(OpenProcess),然后结束进程(TerminateProcess c),最后关闭进程(CloseHandle)。只要学懂这几个API就好理解了。追问:上面那段放在标准模块还是类模块, Private Sub Command1_Click() Dim a As Long, b As Long, c As Long a= FindWindow(vbNullString,"abc.exe") If a<> 0 Then GetWindowThreadProcessId a, b c= OpenProcess(&H1F0FFF, False, b) CloseHandle cElseMsgBox"程序未打开!", 16,"提示"End IfEnd Sub这样就不会错了,TerminateProcess本身不是很好用,应该不能结束系统进程吧,不然也会出错的。这个API本身功能不高。
C#利用TerminateProcess()和OpenProcess()函数阻止结束进程
windows系统有一个叫做system hook的技术,用于让你对系统api做些手脚。
你可以通过注册一个新的TerminateProcess函数钩子,当系统调用这个函数时,就会调用你的函数,你的函数可以判断这个进程是不是你的程序,比如通过窗口的title,class什么的。
如果不是你的窗口,就调用原始的TerminateProcess,如果是你的窗口,就直接return.
另外,你也可以试试重载你的C#程序的WinProc方法,对于WM_CLOSE, WM_DESTORY, WM_QUIT之类的消息进行忽略,只对于自己发出的关闭才正常响应。
上述两个思路,你选择吧。代码没有功夫写。
你的那个思路技术上有些问题。
文章到此结束,希望我们对于terminateprocess的问题能够给您带来一些启发和解决方案。如果您需要更多信息或者有其他问题,请随时联系我们。