关于进程的问题,很急

windeflower 2008-08-04 03:52:48
1.
hProcessHandle = OpenProcess( PROCESS_TERMINATE, FALSE, snt_pid);
bRet = TerminateProcess(hProcessHandle, uExitCode);
hProcessHandle = OpenProcess( PROCESS_TERMINATE, FALSE, snt_pid);
bRet = GetExitCodeProcess(hProcessHandle, lpExitCode);
以上代码中使用了两次OpenProcess(),为什么返回的hProcessHandle 都不会为0?在第二次调用OpenProcess()之前,我已经使用了TerminateProcess()函数将进程强制终止了呀。
2.使用OpenProcess()可以检测已知进程id的进程是否终止了么?(前提是程序没有调用TerminateProcess())
例如,a.exe中创建新进程启动程序b.exe,然后在b.exe窗口中正常关闭窗口,结束b程序(进程),那么使用OpenProcess()能检测到调用的b.exe已经不在运行了么?怎么使用?(有其他办法,也可以指教)
...全文
144 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
windeflower 2008-08-05
  • 打赏
  • 举报
回复
上面是我现在程序的主要逻辑,但是hcE91CheckSNTRuning()时候,
第一次执刑clickbutton()的时候会调用loginBySNursingTheory() 执行了b.exe程序。
但是第二次调用时候,即使我的b.exe程序已经关闭了还会调用huShowMessage(hwndFrame, "E910002", MB_OK );
而不会重新调用 loginBySNursingTheory()来重新执行b.exe程序,
请各位大侠帮忙再分析一下,我的CheckSNTRuning()函数到底应该怎么来写?
windeflower 2008-08-05
  • 打赏
  • 举报
回复
程序的基本逻辑如下:

//全局process id
DWORD snt_pid;
//主线程
void SNTThreadMain(void *info){
SNTInfo *info = (SNTInfo*)data;

PROCESS_INFORMATION pi;
memset(&pi, 0, sizeof(pi));

STARTUPINFO si;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);

if(CreateProcess(info->sntSysName, NULL, NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi )){
info->rc = SNTRC_SNTModuleInvokeError;
goto term;
}else{
info->rc = SNTRC_NORMAL;
info->pid = pi.dwProcessId;
}
term:
if (pi.hProcess)
CloseHandle( pi.hProcess );
info->done = TRUE;

_endthread();
}

DWORD Login(){
uintptr_t nThreadId = _beginthread(SNTThreadMain, 0, &info);
if (nThreadId == -1){
info.rc = SNTRC_ThreadInvokeError;
return NULL;
}
return info.pid;
}

BOOL CheckSNTRuning(){

LPDWORD lpExitCode;
BOOL bRet;

HANDLE hProcessHandle = OpenProcess( PROCESS_TERMINATE, FALSE, snt_pid);
if (hProcessHandle){
bRet = GetExitCodeProcess(hProcessHandle, lpExitCode);
CloseHandle( hProcessHandle );
}

if(bRet){
if((DWORD)lpExitCode == STILL_ACTIVE){
return TRUE;
}
else{
return FALSE;
}
}
else{
return TRUE;
}
}

clickbutton(){
if(hcE91CheckSNTRuning(snt_pid))
huShowMessage(hwndFrame, "E910002", MB_OK );
else
snt_pid = loginBySNursingTheory();
}
e_sharp 2008-08-05
  • 打赏
  • 举报
回复
UP
xkyx_cn 2008-08-04
  • 打赏
  • 举报
回复
if (bRet = GetExitCodeProcess(hProcessHandle, lpExitCode))
{
if (STILL_ACTIVE == *lpExitCode)
{// still active}
else
{// has terminated}
}
else
{
// error occurs
}
fireseed 2008-08-04
  • 打赏
  • 举报
回复
OpenProcess()后一定要CloseHandle()。不然大问题没有,就是内存泄露。

64,651

社区成员

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

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