从另一个进程

时间:2015-06-16 20:58:06

标签: c++ winapi

我有两个流程:ProcessA和ProcessB。

当我启动我的应用程序时,我调用ProcessA,它使用CreateProcess()启动ProcessB。当我的应用程序收到命令A时,ProcessA被ProcessB杀死。同样,ProcessB 应该在收到命令B时重新启动ProcessA

我坚持使用的是重新启动ProcessA的过程。由于ProcessA具有重新启动ProcessB的代码,因此我无法阻止它重新启动ProcessB的另一个实例。理想情况下,我想只有1个ProcessB实例。

为了从ProcessA创建ProcessB,我有以下代码:

for(int i32Index = 0; i32Index < NUM_PROCESS; i32Index++)
        {
            wcscpy(wcPath,Directorypath.c_str());
            wcscat(wcPath,wcProcess[i32Index]);
            RETAILMSG(1,(_T("Path:%s\r\n"),wcPath));
            bCreateProcessSuccess = CreateProcess(wcPath,   // No module name (use command line)
                                    NULL,                   // Command line
                                    NULL,                   // Process handle not inheritable
                                    NULL,                   // Thread handle not inheritable
                                    FALSE,                  // Set handle inheritance to FALSE
                                    0,                      // No creation flags
                                    NULL,                   // Use parent's environment block
                                    NULL,                   // Use parent's starting directory 
                                    &si,                    // Pointer to STARTUPINFO structure
                                    &pi ) ;                 // Pointer to PROCESS_INFORMATION structure
             if(bCreateProcessSuccess == FALSE)
             {
                 RETAILMSG(1,(_T("Create process failed:%d\r\n"),GetLastError()));
             }
             else
             {
                RETAILMSG(1,(_T("Loading Exes\r\n")));
             }

非常简单,基本的代码。我基本上在ProcessB中重复这个,但是它创建了ProcessA。

现在,我坚持认为如果能够在没有再次启动ProcessB的情况下实现启动ProcessA的条件。我最初想过使用一个标志,但是该标志会被重置,因为启动ProcessA会重置标志,因为它是函数的本地标志。

另外,澄清一下:这是在Windows嵌入式紧凑环境中,因此两个进程都作为不同的子项目存在,因此从ProcessB访问ProcessA需要IPC。

我的下一个想法是使用CreateEvent()WaitForSingleObject()来检查事件是否已发出信号,但我意识到等待时间必须是无限的,这将导致第一次出现问题启动我的申请。

那么,是否有任何类型的Windows(wince)api可以解决这个问题? (或者某种我想不到的奇特编码?)

2 个答案:

答案 0 :(得分:6)

有几种方法可以做到这一点,但有两种选择:

  1. 再次启动ProcessA时,使用lpCommandLine参数(例如/nolaunch)将命令行参数传递给它。然后,ProcessA可以在启动时使用GetCommandLine获取其命令行,并查看它是否包含/nolaunch字符串。

  2. 在ProcessA和ProcessB中,使用CreateSemaphoreCreateMutex函数创建命名信号量/互斥量。在ProcessB中,您只需要做 - 只需确保在进程退出之前不关闭句柄。在ProcessA中,创建信号量/互斥锁后检查GetLastError()是否返回ERROR_ALREADY_EXISTS - 这表示ProcessB仍然打开信号量/互斥量(因此已经在运行)。

答案 1 :(得分:2)

有多种方法可以证明这一点:

1。拿着互斥锁

在processB中,您可以保存一个已命名的互斥锁并将其锁定。当将创建processB时,它将尝试锁定互斥锁并失败,并且它将自行终止。您还可以检查互斥锁是否在processA中被锁定,并阻止从头开始创建processB。

2。发送参数以创建流程

CreateProcess支持通过第二个参数向创建的进程发送命令行参数。您可以将其用作是否应创建processB的指示器。

3。浏览流程列表

您可以浏览当前进程列表并检查ProcessB是否已在运行。可能想看看Taking a Snapshot and Viewing Processes