一个Loader,运行后无自动终止。
我用CreateProcess创建了一个进程A后。
我想再用CreateProcess创建另外一个进程B,如果A退出程序后,B自动退出。如果前面的设计不可行,那这样是否可行:CreateProcess B进程时先判断进程中是否运行了B程序(最好通过程序名判断),请问这个判断要怎么判断?谢谢大侠们,本人为一个新手,只会对着教程用CreateProcess,至于其他API函数不懂,望赐教,谢谢。
我用CreateProcess创建了一个进程A后。
我想再用CreateProcess创建另外一个进程B,如果A退出程序后,B自动退出。如果前面的设计不可行,那这样是否可行:CreateProcess B进程时先判断进程中是否运行了B程序(最好通过程序名判断),请问这个判断要怎么判断?谢谢大侠们,本人为一个新手,只会对着教程用CreateProcess,至于其他API函数不懂,望赐教,谢谢。
解决方案 »
- 为什么程序关闭后会自动重启
- 新手问题:怎样在Visual studio 2005里删除函数
- c++如何快速上手vc,谢谢
- 一个定义的问题。很简单的。帮帮忙吧。。谢谢 。。。。。。
- >>>怎么让MFC程序获得命令行参数??<<<<
- 在win2000或xp安全模式下登录者信息
- #pragma once 有何用?如何用?
- 在线等待,icon风格的listctrl控件,在一个item里面多行显示文本信息,该怎么办阿?
- 如何使用VC中还有的ActiveLock.ocx这一个控件?如果有demo就多加一百分。
- ----SetCommMask 与 WaitCommEvent----
- 如何在单击窗口上的叉时,触发一个事件
- LNK2001 错误!
我想再用CreateProcess创建另外一个进程B,如果A退出程序后,B自动退出。
=============================================================
樓主的意思不是很清楚,CreateProcess在MSDN上看看有關它的說明,再就是可以看看孫鑫的那本VC上冇有講的比較清楚
这个难啊,只能强制B退出
那请问:CreateProcess B进程时先判断进程中是否运行了B程序(最好通过程序名判断)
这个怎么判断?
PS:B程序没有窗口名,似乎不能用FindWindow。(B程序是一个运行后自动最小化了,在任务栏不显示,只在系统托盘上显示小图标,那该如何判断是否已经运行了B程序?如果运行了就返回,如果没运行就运行B。
谢谢了。
这个怎么判断?
===
用进程遍历,网上一搜,这种代码大把.B程序没有窗口名,似乎不能用FindWindow。(B程序是一个运行后自动最小化了,在任务栏不显示,只在系统托盘上显示小图标,那该如何判断是否已经运行了B程序?如果运行了就返回,如果没运行就运行B。
===
没有窗口名,或者有窗口类名,findwindow也能用.我想再用CreateProcess创建另外一个进程B,如果A退出程序后,B自动退出。
===
要么B程序是你自己写的,自己做判断.要么用A,B以外的程序来判断.
If the specified process has not terminated, the termination status returned is
STILL_ACTIVE不过你首先要有一个计时器之类的东西,每过一段时间去检查一次,检查到A进程结束,调用TerminateProcess结束进程B
创建进程a,然后b,然后调用WaitForSingleObject,传入进程a的句柄,这样父进程挂起,等待进程a结束,然后关闭进程b
不过这种情况父进程会挂起,可能不符合你的要求,但是这种方法比较简单
CStringList mKillList;
CString strName;
strName = "FLCommuD.exe";
strName.MakeLower();
mKillList.AddTail(strName); strName = "FLCommu.exe";
strName.MakeLower();
mKillList.AddTail(strName); strName = "GLogSvrD.exe";
strName.MakeLower();
mKillList.AddTail(strName); strName = "GLogSvr.exe";
strName.MakeLower();
mKillList.AddTail(strName);
strName = "FLControlD.exe";
strName.MakeLower();
mKillList.AddTail(strName); strName = "FLControl.exe";
strName.MakeLower();
mKillList.AddTail(strName);
DWORD dCurProcessID = ::GetCurrentProcessId(); // aProcesses is an array of Process ID #'s
DWORD aProcesses[1024], cbNeeded;
if ( ! EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded) )
return false;
int pcount = cbNeeded / sizeof(DWORD); // the # of processes for (int i=0; i < pcount; i++)
{
HANDLE hProcess;
TCHAR szProcessName[MAX_PATH] = _T("unknown");
CString ProcessName;
DWORD pid = aProcesses[i];
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); if ( !hProcess ) // OpenProcess failed...
continue; HMODULE hMod;
DWORD cbNeeded;
// Get just the first module in the process. This appears to
// always be the executable file.
if ( ::EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded) )
{
::GetModuleBaseName(hProcess, hMod, szProcessName,
sizeof(szProcessName)); ProcessName = szProcessName;
ProcessName.MakeLower();
// See if the this process is on the kill list
if (mKillList.Find(ProcessName))
{
ProcessName.Format(_T("Terminating Application %s"), szProcessName); if(dCurProcessID != pid){
// Kill the process
UINT uExitCode=0;
TerminateProcess(hProcess, uExitCode);
} // Perhaps calling TerminateProcess isn't the best way
// what other functions could do this?
}
} CloseHandle(hProcess);
}
可以在另一个进程中等待互斥体.无论创建互斥体的进程如何退出(正常还是被强制中止).等待的进程中的Wait都会返回.这时等待进程就可以结束了.