进程问题,很急

windeflower 2008-08-04 03:55:20
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已经不在运行了么?怎么使用?(有其他办法,也可以指教)
...全文
149 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sun_hw 2008-08-06
  • 打赏
  • 举报
回复
在B.exe中建立互斥体
在A.exe中hcE91CheckSNTRuning检查open这个互斥体,如果互斥体存在,说明B.exe已经启动没有关闭,hcE91CheckSNTRuning返回TRUE,否则返回FALSE,调用login()。
windeflower 2008-08-05
  • 打赏
  • 举报
回复
程序的基本逻辑如下:

//全局process id
DWORD snt_pid;
//主线程,调用B.EXE
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();
}

//创建调用B.EXE的主线程
DWORD Login(){
uintptr_t nThreadId = _beginthread(SNTThreadMain, 0, &info);
if (nThreadId == -1){
info.rc = SNTRC_ThreadInvokeError;
return NULL;
}
return info.pid;
}

//检查B.EXE程序是否正在运行
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;
}
}

//A界面上点击按钮,调用B.EXE程序
clickbutton(){
if(hcE91CheckSNTRuning(snt_pid))
huShowMessage(hwndFrame, "E910002", MB_OK );
else
snt_pid = login();
}

上面是我现在程序的主要逻辑,但是hcE91CheckSNTRuning()时候,
第一次执刑clickbutton()的时候会调用login() 执行了b.exe程序。
但是第二次调用时候,即使我的b.exe程序已经关闭了还会调用huShowMessage(hwndFrame, "E910002", MB_OK );
而不会重新调用 login()来重新执行b.exe程序,
请各位大侠帮忙再分析一下,我的CheckSNTRuning()函数到底应该怎么来写?
windeflower 2008-08-05
  • 打赏
  • 举报
回复
程序的基本逻辑如下:

//全局process id
DWORD snt_pid;
//主线程,调用B.EXE
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();
}

//创建调用B.EXE的主线程
DWORD Login(){
uintptr_t nThreadId = _beginthread(SNTThreadMain, 0, &info);
if (nThreadId == -1){
info.rc = SNTRC_ThreadInvokeError;
return NULL;
}
return info.pid;
}

//检查B.EXE程序是否正在运行
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;
}
}

//A界面上点击按钮,调用B.EXE程序
clickbutton(){
if(hcE91CheckSNTRuning(snt_pid))
huShowMessage(hwndFrame, "E910002", MB_OK );
else
snt_pid = login();
}

上面是我现在程序的主要逻辑,但是hcE91CheckSNTRuning()时候,
第一次执刑clickbutton()的时候会调用loginBySNursingTheory() 执行了b.exe程序。
但是第二次调用时候,即使我的b.exe程序已经关闭了还会调用huShowMessage(hwndFrame, "E910002", MB_OK );
而不会重新调用 loginBySNursingTheory()来重新执行b.exe程序,
请各位大侠帮忙再分析一下,我的CheckSNTRuning()函数到底应该怎么来写?
windeflower 2008-08-04
  • 打赏
  • 举报
回复
谢谢楼上几位兄弟,不过问题还没有解决。

我说明一下:
上面的兄弟们说的好像是从子进程(b.exe)方面来考虑,但是B程序我是改不了的,B程序就是一个普通的可执行文件,我在A程序里使用
CreateProcess(info->sntSysName, NULL, NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi )
创建进程,调用B.EXE程序。
B.EXE程序内没有对于自身同时运行2次不允许的判断,所以在A调用B.EXE时候,希望在A代码中完成,如果B.EXE正在执行的话,弹出警告信息,不创建新的进程再次执行B.EXE程序。
DarknessTM 2008-08-04
  • 打赏
  • 举报
回复
多进程是特化的多线程,注意同步问题
gaoteng1984 2008-08-04
  • 打赏
  • 举报
回复
MSDN上的话:
TerminateProcess initiates termination and returns immediately. This stops execution of all threads within the process and requests cancellation of all pending I/O. The terminated process cannot exit until all pending I/O has been completed or canceled.
1个可能是因为是异步函数,要等一下那个目标进程才能结束。
另1个可能是目标进程有阻塞的IO操作,没有被终止掉。
kakashi0309 2008-08-04
  • 打赏
  • 举报
回复
时间问题吧

中间等待个几秒钟看看
ouyh12345 2008-08-04
  • 打赏
  • 举报
回复
用WaitForSingleObject来判断进程是否还在
ouyh12345 2008-08-04
  • 打赏
  • 举报
回复
1、生成了2个进程

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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