为什么TerminateProcess不能结束进程解决思路
为什么TerminateProcess不能结束进程
这是程序中的一段代码,在gambit运行后会有一个窗口StartUp,和exceed.exe,为什么用TerminateProcess不能结束这两个进程,而在主函数中部运行gambit(),单独运行结束进程的代码时有效,请各位帮忙看看,谢谢了
void gambit()
{
CString cmdline="-id zzj -init E:\\zuoye\\gambit1\\1.jou -new";//命令行参数"-id zzj -init 建模 -new"
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 执行 下面的命令, 绝大部分进程都能结束,方便实用。
ntsd -c q -pn imagename.exe
------解决方案--------------------
if(!strcmp(str1,"exceed.exe") || !strcmp(str1,"gambit.exe"))
{
HANDLE han2=OpenProcess(1,TRUE,lpp.th32ProcessID); //取进程实例 PROCESS_TERMINATE
//cout<<str;
TerminateProcess(han2,0); //关闭
}
----------------
你Debug下调试一下,这里if语句里的OpenProcess函数执行成功?
这是程序中的一段代码,在gambit运行后会有一个窗口StartUp,和exceed.exe,为什么用TerminateProcess不能结束这两个进程,而在主函数中部运行gambit(),单独运行结束进程的代码时有效,请各位帮忙看看,谢谢了
void gambit()
{
CString cmdline="-id zzj -init E:\\zuoye\\gambit1\\1.jou -new";//命令行参数"-id zzj -init 建模 -new"
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 执行 下面的命令, 绝大部分进程都能结束,方便实用。
ntsd -c q -pn imagename.exe
------解决方案--------------------
if(!strcmp(str1,"exceed.exe") || !strcmp(str1,"gambit.exe"))
{
HANDLE han2=OpenProcess(1,TRUE,lpp.th32ProcessID); //取进程实例 PROCESS_TERMINATE
//cout<<str;
TerminateProcess(han2,0); //关闭
}
----------------
你Debug下调试一下,这里if语句里的OpenProcess函数执行成功?