请教怎样用GetExitCodeProcess函数返回某个进程是否运行?

jack20042005 2008-08-26 08:09:01
对着 MSDN 试了半天参数 也没有成功啊

比如已知某个进程号为:2000 要查这个进程是否在运行。谁能给个例子,最好有参数的类型与使用说明。谢谢啦
...全文
6121 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
bitasd 2010-05-10
  • 打赏
  • 举报
回复
m_hProcess = 0; 初始化
bitasd 2010-05-10
  • 打赏
  • 举报
回复
这个回答是不是很迟……

HANDLE m_hProcess; //进程句柄,用来记录要打开的程序进程

void CMyView::OnMapgeneratorButton()
{
// TODO: Add your command handler code here
if(m_hProcess)
{
if(!::TerminateProcess(m_hProcess,0))
AfxMessageBox(_T("Cannot Close"));
m_hProcess = 0;
}
else
{
STARTUPINFO si; //用于在创建子进程时设置各种属性
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
si.wShowWindow=SW_SHOW;
si.dwFlags=STARTF_USESHOWWINDOW;
PROCESS_INFORMATION pi;//用于在进程创建后接受相关信息
bool fRet= CreateProcess(_T("D:\\360Downloads\\vld-1.9h-setup.exe"),NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);
if(fRet)
m_hProcess = pi.hProcess; //打开成功,给进程句柄赋值
else
AfxMessageBox(_T("Cannot find!"));
}
}


void CMyView::OnUpdateMapgeneratorButton(CCmdUI *pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_hProcess)
{
DWORD dwMark;
if(GetExitCodeProcess(m_hProcess,&dwMark))
{
if( STILL_ACTIVE == dwMark) //依然活动,说明存在
{
pCmdUI->SetText(_T("Close Map Generator"));
}
else
{
pCmdUI->SetText(_T("Start Map Generator"));
m_hProcess = 0;
}
}
}
else
pCmdUI->SetText(_T("Start Map Generator"));
}
jack20042005 2008-08-30
  • 打赏
  • 举报
回复
已经加分了 希望讨论充分点
jack20042005 2008-08-28
  • 打赏
  • 举报
回复
GetExitCodeProcess函数自身的具体使用方法还没人谈
不过 会考虑使用WaitForSingleObject 函数


使用Te r m i n a t e P r o c e s s 函数过程中 发现一个问题 就是最普通的进程 比如 记事本程序等都能关闭
可是除了系统进程外 还有一些进程 比如atievxx.exe病毒的进程就无法结束(但用任务管理器可以手工结束) 为什么呢?
jack20042005 2008-08-27
  • 打赏
  • 举报
回复


4楼:您说的强制转换指哪个?我写的long dwExitCode类型就是根据MSDN上写的参数类型啊 直接套用的。
5楼:只是为了方便讨论 本帖主要讨论GetExitCodeProcess函数与参数使用方法 并想获取错误码看看是什么样的东东
6楼:同上。
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 heimu2257 的回复:]
参见 window 核心编程 第四章 进程的退出。

进程属于内核对象, 可以使用 WaitForSingleObject 函数等待进程句柄。 判断运行状态。
[/Quote]
使用这个判断进程是否运行
heimu2257 2008-08-27
  • 打赏
  • 举报
回复
参见 window 核心编程 第四章 进程的退出。

进程属于内核对象, 可以使用 WaitForSingleObject 函数等待进程句柄。 判断运行状态。
heimu2257 2008-08-27
  • 打赏
  • 举报
回复
4.3.4 进程终止运行时出现的情况
当进程终止运行时,下列操作将启动运行:
1) 进程中剩余的所有线程全部终止运行。
2) 进程指定的所有用户对象和G D I对象均被释放,所有内核对象均被关闭(如果没有其他
进程打开它们的句柄,那么这些内核对象将被撤消。但是,如果其他进程打开了它们的句柄,
内核对象将不会撤消)。
3) 进程的退出代码将从S T I L L _ A C T I V E改为传递给E x i t P r o c e s s或Te r m i n a t e P r o c e s s的代码。
4) 进程内核对象的状态变成收到通知的状态(关于传送通知的详细说明,参见第9章)。系
统中的其他线程可以挂起,直到进程终止运行。
5) 进程内核对象的使用计数递减1。
注意,进程的内核对象的寿命至少可以达到进程本身那么长,但是进程内核对象的寿命可
能大大超过它的进程寿命。当进程终止运行时,系统能够自动确定它的内核对象的使用计数。
如果使用计数降为0,那么没有其他进程拥有该对象打开的句柄,当进程被撤消时,对象也被
撤消。
不过,如果系统中的另一个进程拥有正在被撤消的进程的内核对象的打开句柄,那么该进
程内核对象的使用计数不会降为0。当父进程忘记关闭子进程的句柄时,往往就会发生这样的
情况。这是个特性,而不是错误。记住,进程内核对象维护关于进程的统计信息。即使进程已
经终止运行,该信息也是有用的。例如,你可能想要知道进程需要多少C P U时间,或者,你想
通过调用G e t E x i t C o d e P r o c e s s来获得目前已经撤消的进程的退出代码:
该函数查看进程的内核对象(由h P r o c e s s参数来标识),取出内核对象的数据结构中用于标
识进程的退出代码的成员。该退出代码的值在p d w E x i t C o d e参数指向的D W O R D中返回。
可以随时调用该函数。如果调用G e t E x i t C o d e P r o c e s s函数时进程尚未终止运行,那么该函
数就用S T I L L _ A C T I V E标识符(定义为0 x 1 0 3)填入D W O R D。如果进程已经终止运行,便返
回数据的退出代码值。
也许你会认为,你可以编写代码,通过定期调用G e t E x i t C o d e P r o c e s s函数并且检查退出代
码来确定进程是否已经终止运行。大多数情况下,这是可行的,但是效率不高。下一段将介绍
用什么正确的方法来确定进程何时终止运行。
再一次提醒你,应该通过调用C l o s e H a n d l e函数,告诉系统你对进程的统计数据已经不再
感兴趣。如果进程已经终止运行,C l o s e H a n d l e将递减内核对象的使用计数,并将它释放。
jack20042005 2008-08-27
  • 打赏
  • 举报
回复
UP
qgw_2000 2008-08-26
  • 打赏
  • 举报
回复
如果知道进程ID的话,你可以直接调用OpenProcess API来判断进程是否在运行。
OphoneOu 2008-08-26
  • 打赏
  • 举报
回复
不建议通过进程号为:2000来查看进程是否在运行?
因为进程号可以重复.
得到的进程不一定正确..
薛定谔之死猫 2008-08-26
  • 打赏
  • 举报
回复
强制类型转换要加括号,并且传入的是指针,要指向合法内存,不然会出现访问违例
jack20042005 2008-08-26
  • 打赏
  • 举报
回复
3.请问 根据MSDN lpExitCode是Long类型,为什么您知道要用DWORD和&呢?可不可以这样写?
GetExitCodeProcess(pi.hProcess,long dwExitCode);
XXX=*dwExitCode
jack20042005 2008-08-26
  • 打赏
  • 举报
回复
DWORD dwExitCode;
GetExitCodeProcess(pi.hProcess, &dwExitCode);

1.如何用Printf函数输出退出代码呀?
dwExitCode是DWORD类型的 不知道需要进行怎样的类型变换可以输出 进行判断。


2.我在控制台中 最后用"cout>>"ECHO"; " 为什么这条语句编译通过,却没输出呢?(printf却可以)
冷月清晖 2008-08-26
  • 打赏
  • 举报
回复
This function returns immediately. If the process has not terminted and the function succeeds, the status returned is STILL_ACTIVE. If the process has terminated and the function succeeds, the status returned is one of the following values:


The exit value specified in the ExitProcess or TerminateProcess function.
The return value from the main or WinMain function of the process.
The exception value for an unhandled exception that caused the process to terminate.


参数 类型及说明
hProcess Long,想获取退出代码的一个进程的句柄
lpExitCode Long,用于装载进程退出代码的一个长整数变量。如进程尚未中止,则设为常数STILL_ACTIVE

例子:

// 临时变量

  CString sCommandLine;

  char cWindowsDirectory[MAX_PATH];

  char cCommandLine[MAX_PATH];

  DWORD dwExitCode;

  PROCESS_INFORMATION pi;

  STARTUPINFO si = {sizeof(si)};

  // 得到Windows目录

  GetWindowsDirectory(cWindowsDirectory, MAX_PATH);

  // 启动"记事本"程序的命令行

  sCommandLine = CString(cWindowsDirectory) + "\\NotePad.exe";

  ::strcpy(cCommandLine, sCommandLine);

  // 启动"记事本"作为子进程

  BOOL ret = CreateProcess(NULL, cCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, pi);

  if (ret) {

   // 关闭子进程的主线程句柄

   CloseHandle(pi.hThread);

   // 等待子进程的退出

   WaitForSingleObject(pi.hProcess, INFINITE);

   // 获取子进程的退出码

   GetExitCodeProcess(pi.hProcess, &dwExitCode);

   // 关闭子进程句柄

   CloseHandle(pi.hProcess);

  }

  此段代码首先通过CreateProcess()创建Windows自带的“记事本”程序为子进程,子进程启动后父进程通过WaitForSingleObject()函数等待其执行的结束,在子进程没有退出前父进程是一直处于阻塞状态的,这里子进程的作用同单线程中的函数类似。一旦子进程退出,WaitForSingleObject()函数所等待的pi.hProcess对象将得到通知,父进程将得以继续,如有必要可以通过GetExitCodeProcess()来获取子进程的退出代码。

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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