﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-天狼啸月-文章分类-进程</title><link>http://www.cppblog.com/wuqingchenxinda/category/18402.html</link><description>天狼神族</description><language>zh-cn</language><lastBuildDate>Fri, 23 Dec 2011 02:42:41 GMT</lastBuildDate><pubDate>Fri, 23 Dec 2011 02:42:41 GMT</pubDate><ttl>60</ttl><item><title>C++创建进程，结束进程</title><link>http://www.cppblog.com/wuqingchenxinda/articles/162639.html</link><dc:creator>烈焰之光</dc:creator><author>烈焰之光</author><pubDate>Fri, 23 Dec 2011 00:42:00 GMT</pubDate><guid>http://www.cppblog.com/wuqingchenxinda/articles/162639.html</guid><wfw:comment>http://www.cppblog.com/wuqingchenxinda/comments/162639.html</wfw:comment><comments>http://www.cppblog.com/wuqingchenxinda/articles/162639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wuqingchenxinda/comments/commentRss/162639.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wuqingchenxinda/services/trackbacks/162639.html</trackback:ping><description><![CDATA[<p>&nbsp; 在VC程序中创建进程,结束进程，按如下步骤进行即可：</p>
<p>&nbsp;&nbsp;&nbsp; 1.取得进程的句柄（利用FindWindow函数得到）；</p>
<p>&nbsp;&nbsp;&nbsp; 2.获取进程ID号（用GetWindowThreadProcessId函数获取）；</p>
<p>&nbsp;&nbsp;&nbsp; 3.打开进程，OpenProcess函数中的第一个参数设为PROCESS_TERMINATE，就可以获取处理该进程的句柄；</p>
<p>&nbsp;&nbsp;&nbsp; 4.利用TerminateProcess函数结束进程，将该函数的第二个参数设为4。<br />&nbsp;&nbsp;&nbsp; 代码如下：</p>
<p>&nbsp;&nbsp;&nbsp; //结束进程<br />&nbsp;&nbsp;&nbsp; int CStaticFunc::KillProcess(LPCSTR pszClassName, LPCSTR<br />&nbsp;&nbsp;&nbsp; pszWindowTitle)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; HANDLE hProcessHandle;<br />&nbsp;&nbsp;&nbsp; ULONG nProcessID;<br />&nbsp;&nbsp;&nbsp; HWND TheWindow;<br />&nbsp;&nbsp;&nbsp; TheWindow = ::FindWindow( NULL, pszWindowTitle );</p>
<p>&nbsp;&nbsp;&nbsp; ///方法一：</p>
<p>&nbsp;&nbsp;&nbsp; ::GetWindowThreadProcessId( TheWindow, &amp;nProcessID );<br />&nbsp;&nbsp;&nbsp; hProcessHandle = ::OpenProcess( PROCESS_TERMINATE, FALSE,<br />&nbsp;&nbsp;&nbsp; nProcessID );<br />&nbsp;&nbsp;&nbsp; return ::TerminateProcess( hProcessHandle, 4 );</p>
<p>&nbsp;&nbsp;&nbsp; ///方法二：</p>
<p>&nbsp;&nbsp;&nbsp; return ::PostMessage(TheWindow, WM_CLOSE, NULL, NULL);<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; 而启动进程则只需要CreateProcess函数就可完成，需要注意的是这个函数的几个输入参数，第一个参数是</p>
<p>&nbsp;&nbsp;&nbsp; //创建新进程</p>
<p>&nbsp;&nbsp;&nbsp; ///方法一：</p>
<p>&nbsp;&nbsp;&nbsp; int CStaticFunc::CreateNewProcess(LPCSTR pszExeName)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; PROCESS_INFORMATION piProcInfoGPS;<br />&nbsp;&nbsp;&nbsp; STARTUPINFO siStartupInfo;<br />&nbsp;&nbsp;&nbsp; SECURITY_ATTRIBUTES saProcess, saThread;<br />&nbsp;&nbsp;&nbsp; ZeroMemory( &amp;siStartupInfo, sizeof(siStartupInfo) );<br />&nbsp;&nbsp;&nbsp; siStartupInfo.cb = sizeof(siStartupInfo);<br />&nbsp;&nbsp;&nbsp; saProcess.nLength = sizeof(saProcess);<br />&nbsp;&nbsp;&nbsp; saProcess.lpSecurityDescriptor = NULL;<br />&nbsp;&nbsp;&nbsp; saProcess.bInheritHandle = true;<br />&nbsp;&nbsp;&nbsp; saThread.nLength = sizeof(saThread);<br />&nbsp;&nbsp;&nbsp; saThread.lpSecurityDescriptor = NULL;<br />&nbsp;&nbsp;&nbsp; saThread.bInheritHandle = true;<br />&nbsp;&nbsp;&nbsp; return ::CreateProcess( NULL, (LPTSTR)pszExeName, &amp;saProcess,<br />&nbsp;&nbsp;&nbsp; &amp;saThread, false,<br />&nbsp;&nbsp;&nbsp; CREATE_DEFAULT_ERROR_MODE, NULL, NULL,<br />&nbsp;&nbsp;&nbsp; &amp;siStartupInfo,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;piProcInfoGPS );<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; ///方法二：</p>
<p>&nbsp;&nbsp;&nbsp; WinExec(lpCmdLine, uCmdShow);</p> <img src ="http://www.cppblog.com/wuqingchenxinda/aggbug/162639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wuqingchenxinda/" target="_blank">烈焰之光</a> 2011-12-23 08:42 <a href="http://www.cppblog.com/wuqingchenxinda/articles/162639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++结束进程</title><link>http://www.cppblog.com/wuqingchenxinda/articles/162638.html</link><dc:creator>烈焰之光</dc:creator><author>烈焰之光</author><pubDate>Fri, 23 Dec 2011 00:41:00 GMT</pubDate><guid>http://www.cppblog.com/wuqingchenxinda/articles/162638.html</guid><wfw:comment>http://www.cppblog.com/wuqingchenxinda/comments/162638.html</wfw:comment><comments>http://www.cppblog.com/wuqingchenxinda/articles/162638.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wuqingchenxinda/comments/commentRss/162638.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wuqingchenxinda/services/trackbacks/162638.html</trackback:ping><description><![CDATA[　　1.使用ExitProcess()结束进程 <br /><br />　　进程只是提供了一段地址空间和内核对象，其运行时通过在其地址空间内的主线程来体现的。当主线程的进入点函数返回时，进程也就随之结束。这种进程的终止方式是进程的正常退出，进程中的所有线程资源都能够得到正确的清除。除了这种进程的正常退出方式外，有时还需要在程序中通过代码来强制结束本进程或其他进程的运行。ExitProcess()函数的原型为： <br /><br />　　void ExitProcess(UINT uExitCode); <br /><br />　　其参数uExitCode为进程设置了退出代码。该函数具有强制性，在执行完毕后进程即被结束，因此位于其后的任何代码将不能被执行。虽然 ExitProcess()函数可以在结束进程的同时通知与其关联的动态链接库，但是由于它的这种执行的强制性，使得ExitProcess()函数在使用上将存在有安全隐患。例如，如果在程序调用ExitProcess()函数之前曾用new操作符申请过一段空间，那么将会由于ExitProcess()函数的强制性而无法通过delete操作符将其释放，从而造成内存泄露。有鉴于ExitProcess()函数的强制性和不安全性，在使用时一定要引起注意。 <br /><br />　　2.使用TerminateProcess()结束进程 <br /><br />　　ExitProcess()只能强制执行本进程的退出，如果要在一个进程中强制结束其他进程就要用TerminateProcess()来实现。与ExitProcess()不同，TerminateProcess()函数执行后，被终止的进程是不会的到任何关于程序退出的通知的。也就是说，被终止的进程是无法在结束运行前进行退出前的收尾工作的。所以，通常只有在其他任何方法都无法迫使进程退出时才会考虑使用 TerminateProcess()去强制结束进程。下面给出TerminateProcess()的函数原型： <br /><br />　　BOOL TerminateProcess(HANDLE hProcess,UINT uExitCode); <br /><br />　　参数hProcess和uExitCode分别为进程句柄和退出代码。如果被结束的是本进程，可以通过GetCurrentProcess() 获取到句柄。TerminateProcess()是异步执行的，在调用返回后并不能确定被终止进程是否已经真的退出，如果调用 TerminateProcess()的进程对此细节关心，可以通过WaitForSingleObject()来等待进程的真正结束。 <br /><br />　　在VC程序中如何结束系统正在运行的其他进程（该进程必须有窗口界面），其实很简单，按如下步骤进行即可： <br /><br />　　1.取得进程的句柄（利用FindWindow函数得到）; <br /><br />　　2.获取进程ID号（用GetWindowThreadProcessId函数获取）; <br /><br />　　3.打开进程，OpenProcess函数中的第一个参数设为PROCESS_TERMINATE，就可以获取处理该进程的句柄; <br /><br />　　4.利用TerminateProcess函数结束进程，将该函数的第二个参数设为4。 <br /><br />　　代码如下： <br /><br />　　//结束进程 <br /><br />　　int CStaticFunc::KillProcess(LPCSTR pszClassName, LPCSTR <br /><br />　　pszWindowTitle) <br /><br />　　{ <br /><br />　　HANDLE hProcessHandle; <br /><br />　　ULONG nProcessID; <br /><br />　　HWND TheWindow; <br /><br />　　TheWindow = ::FindWindow( NULL, pszWindowTitle ); <br /><br />　　::GetWindowThreadProcessId( TheWindow, &amp;nProcessID );&nbsp;<br />hProcessHandle = ::OpenProcess( PROCESS_TERMINATE, FALSE, <br /><br />　　nProcessID ); <br /><br />　　return ::TerminateProcess( hProcessHandle, 4 ); <br /><br />　　} <br /><br />　　而启动进程则只需要CreateProcess函数就可完成，需要注意的是这个函数的几个输入参数，第一个参数是 <br /><br />　　//启动新进程 <br /><br />　　int CStaticFunc::CreateNewProcess(LPCSTR pszExeName) <br /><br />　　{ <br /><br />　　PROCESS_INFORMATION piProcInfoGPS; <br /><br />　　STARTUPINFO siStartupInfo; <br /><br />　　SECURITY_ATTRIBUTES saProcess, saThread; <br /><br />　　ZeroMemory( &amp;siStartupInfo, sizeof(siStartupInfo) ); <br /><br />　　siStartupInfo.cb = sizeof(siStartupInfo); <br /><br />　　saProcess.nLength = sizeof(saProcess); <br /><br />　　saProcess.lpSecurityDescriptor = NULL; <br /><br />　　saProcess.bInheritHandle = true; <br /><br />　　saThread.nLength = sizeof(saThread); <br /><br />　　saThread.lpSecurityDescriptor = NULL; <br /><br />　　saThread.bInheritHandle = true; <br /><br />　　return ::CreateProcess( NULL, (LPTSTR)pszExeName, &amp;saProcess, <br /><br />　　&amp;saThread, false, <br /><br />　　CREATE_DEFAULT_ERROR_MODE, NULL, NULL, <br /><br />　　&amp;siStartupInfo, &amp;piProcInfoGPS ); <br /><br /> <img src ="http://www.cppblog.com/wuqingchenxinda/aggbug/162638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wuqingchenxinda/" target="_blank">烈焰之光</a> 2011-12-23 08:41 <a href="http://www.cppblog.com/wuqingchenxinda/articles/162638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++遍历进程</title><link>http://www.cppblog.com/wuqingchenxinda/articles/162637.html</link><dc:creator>烈焰之光</dc:creator><author>烈焰之光</author><pubDate>Fri, 23 Dec 2011 00:39:00 GMT</pubDate><guid>http://www.cppblog.com/wuqingchenxinda/articles/162637.html</guid><wfw:comment>http://www.cppblog.com/wuqingchenxinda/comments/162637.html</wfw:comment><comments>http://www.cppblog.com/wuqingchenxinda/articles/162637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wuqingchenxinda/comments/commentRss/162637.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wuqingchenxinda/services/trackbacks/162637.html</trackback:ping><description><![CDATA[<pre id="best-answer-content" class="reply-text mb10">#include&lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include "PSAPI.H"
#pragma comment( lib, "PSAPI.LIB" )

BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName);

int main(void)
{
DWORD processid[1024],needed,processcount,i;
  HANDLE hProcess;
  HMODULE hModule;
  char path[MAX_PATH] = "",temp[256];
    
  HANDLE hToken;
    
  printf("ShowProcessPath 2.0 with [Process Status API]\n\n");
    
  if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&amp;hToken) )
  {
  if (EnablePrivilege(hToken,SE_DEBUG_NAME))
  {
  EnumProcesses(processid, sizeof(processid), &amp;needed);
  processcount=needed/sizeof(DWORD);
    
  for (i=0;i&lt;processcount;i++)
  {
  hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processid[i]);
  if (hProcess)
  {
  EnumProcessModules(hProcess, &amp;hModule, sizeof(hModule), &amp;needed);
  GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
  GetShortPathName(path,path,256);
  itoa(processid[i],temp,10);
  printf("%s --- %s\n",path,temp);
  }
  else
  printf("Failed!!!\n");
  }
  }
  }
    
  CloseHandle(hProcess);
  CloseHandle(hModule);
    
  itoa(processcount,temp,10);
  printf("\nProcess Count:%s\n\n",temp);

  return 0;
}

BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)
{
    
  TOKEN_PRIVILEGES tkp;
    
  LookupPrivilegeValue( NULL,szPrivName,&amp;tkp.Privileges[0].Luid );//修改进程权限
  tkp.PrivilegeCount=1;
  tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
  AdjustTokenPrivileges( hToken,FALSE,&amp;tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
    
  return( (GetLastError()==ERROR_SUCCESS) );
}</pre> <img src ="http://www.cppblog.com/wuqingchenxinda/aggbug/162637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wuqingchenxinda/" target="_blank">烈焰之光</a> 2011-12-23 08:39 <a href="http://www.cppblog.com/wuqingchenxinda/articles/162637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>