CreateProcess奇怪的行为

CreateProcess strange behaviour

本文关键字:CreateProcess      更新时间:2023-10-16

我编写了一个应用程序,它只执行java -jar。我希望启动器应用程序在执行CreateProcessA后立即退出。

LPSTR _cmdupdate = const_cast<char *> (cmdupdate.c_str());
STARTUPINFO info = {sizeof (info)};
ZeroMemory(&info,sizeof(info));
info.cb=sizeof(info);
PROCESS_INFORMATION processInfo;
ZeroMemory(&processInfo,sizeof(processInfo));
CreateProcessA(TEXT(java_exe.c_str()), _cmdupdate, NULL, NULL, false, 0, NULL, TEXT("bin"), &info, &processInfo);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
exit(0);

如果我通过IDE(Netbeans 7)执行此操作,一切都很好:java在启动器终止时继续运行。如果我通过双击来运行相同的exe:java启动jar,但启动器等待java进程退出。

那么,当通过IDE运行与独立运行时,CreateProcess有什么区别呢?

Java解释器是一个控制台进程。很可能您的程序也是一个控制台进程,所以Java继承并共享您的控制台。这就是为什么您的流程似乎在等待Java完成。事实并非如此,只是控制台就在那里。

当您从IDE运行程序时,它可能会以一种特殊的方式处理控制台,并在程序完成时使其消失。或者,它可能会重定向输出并首先隐藏控制台。

解决方案:使用此处定义的一些标志来处理新进程的控制台。尝试CREATE_NEW_CONSOLEDETACHED_PROCESS,或者CREATE_NO_WINDOW