我有两个流程: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")));
}
Run Code Online (Sandbox Code Playgroud)
非常简单,基本的代码.我基本上在ProcessB中重复这个,但是它创建了ProcessA.
现在,我坚持如何能够实现条件来启动ProcessA而不再启动ProcessB.我最初想过使用一个标志,但是该标志会被重置,因为启动ProcessA会重置标志,因为它是函数的本地标志.
此外,澄清一下:这是在Windows嵌入式紧凑环境中,因此两个进程都作为不同的子项目存在,因此从ProcessB访问ProcessA需要IPC.
我的下一个想法是使用CreateEvent()with WaitForSingleObject()来检查事件是否发出信号,但我意识到等待持续时间必须是无限的,这将在我第一次启动我的应用程序时引起问题.
那么,是否有任何类型的Windows(wince)api可以解决这个问题?(或者某种我想不到的奇特编码?)
有几种方法可以做到这一点,但有两种选择:
再次启动ProcessA时,使用lpCommandLine参数(例如/nolaunch)将命令行参数传递给它.然后,ProcessA可以GetCommandLine在启动时使用它的命令行并查看它是否包含/nolaunch字符串.
在ProcessA和ProcessB中,使用CreateSemaphore或CreateMutex函数创建命名信号量/互斥量.在ProcessB中,您只需要做 - 只需确保在进程退出之前不关闭句柄.在ProcessA中,在创建信号量/互斥锁后检查是否GetLastError()返回ERROR_ALREADY_EXISTS- 这表示ProcessB仍然打开信号量/互斥量(因此已经在运行).