一个Loader,运行后无自动终止。
我用CreateProcess创建了一个进程A后。
我想再用CreateProcess创建另外一个进程B,如果A退出程序后,B自动退出。如果前面的设计不可行,那这样是否可行:CreateProcess  B进程时先判断进程中是否运行了B程序(最好通过程序名判断),请问这个判断要怎么判断?谢谢大侠们,本人为一个新手,只会对着教程用CreateProcess,至于其他API函数不懂,望赐教,谢谢。

解决方案 »

  1.   

    我用CreateProcess创建了一个进程A后。
    我想再用CreateProcess创建另外一个进程B,如果A退出程序后,B自动退出。
    =============================================================
    樓主的意思不是很清楚,CreateProcess在MSDN上看看有關它的說明,再就是可以看看孫鑫的那本VC上冇有講的比較清楚
      

  2.   

    如果A退出程序后,B自动退出。
    这个难啊,只能强制B退出
      

  3.   

    谢谢楼上的大侠们,谢谢。
    那请问:CreateProcess  B进程时先判断进程中是否运行了B程序(最好通过程序名判断)
    这个怎么判断?
    PS:B程序没有窗口名,似乎不能用FindWindow。(B程序是一个运行后自动最小化了,在任务栏不显示,只在系统托盘上显示小图标,那该如何判断是否已经运行了B程序?如果运行了就返回,如果没运行就运行B。
    谢谢了。
      

  4.   

    http://topic.csdn.net/t/20050120/16/3741546.html
      

  5.   

    CreateProcess  B进程时先判断进程中是否运行了B程序(最好通过程序名判断)
    这个怎么判断?
    ===
    用进程遍历,网上一搜,这种代码大把.B程序没有窗口名,似乎不能用FindWindow。(B程序是一个运行后自动最小化了,在任务栏不显示,只在系统托盘上显示小图标,那该如何判断是否已经运行了B程序?如果运行了就返回,如果没运行就运行B。
    ===
    没有窗口名,或者有窗口类名,findwindow也能用.我想再用CreateProcess创建另外一个进程B,如果A退出程序后,B自动退出。
    ===
    要么B程序是你自己写的,自己做判断.要么用A,B以外的程序来判断.
      

  6.   

    用GetExitCodeProcess来检查进程是否结束
    If the specified process has not terminated, the termination status returned is 
    STILL_ACTIVE不过你首先要有一个计时器之类的东西,每过一段时间去检查一次,检查到A进程结束,调用TerminateProcess结束进程B
      

  7.   

    或者用WaitForSingleObject
    创建进程a,然后b,然后调用WaitForSingleObject,传入进程a的句柄,这样父进程挂起,等待进程a结束,然后关闭进程b
    不过这种情况父进程会挂起,可能不符合你的要求,但是这种方法比较简单
      

  8.   

    用下面代码可以找到有没有进程并杀掉。
    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);
        }
      

  9.   

    用互斥体.
    可以在另一个进程中等待互斥体.无论创建互斥体的进程如何退出(正常还是被强制中止).等待的进程中的Wait都会返回.这时等待进程就可以结束了.