我有两个进程:ProcessA和ProcessB。

启动应用程序时,我调用使用CreateProcess()的ProcessA来启动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。

现在,即时通讯卡住了我如何能够实现启动ProcessA的条件,而无需再次启动ProcessB。我最初考虑使用一个标志,但是由于启动ProcessA会将该标志重置为该函数的本地标志,因此将重置该标志。

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

我的下一个想法是使用CreateEvent()WaitForSingleObject()来检查事件是否已发出信号,但是我意识到等待时间必须无限长,这将在我第一次启动应用程序时引起问题。

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

最佳答案

有几种方法可以执行此操作,但是有两个选择:

  • 再次启动ProcessA时,请使用lpCommandLine参数(例如/nolaunch)将其传递给命令行参数。然后,ProcessA可以在启动时使用 GetCommandLine 获取其命令行,并查看其是否包含/nolaunch字符串。
  • 在ProcessA和ProcessB中,都使用 CreateSemaphore CreateMutex 函数创建一个命名信号量/互斥量。在ProcessB中,这就是您要做的全部-仅确保在过程退出之前不要关闭手柄。在ProcessA中,在创建信号量/互斥量之后,检查GetLastError()是否返回ERROR_ALREADY_EXISTS-这表明ProcessB仍然打开了信号量/互斥量(因此已经在运行)。
  • 09-06 09:57