2012-02-13 94 views
2

我写了一个应用程序,它只是执行java -jar。我希望启动器应用程序在执行CreateProcessA后立即退出。CreateProcess阻塞 - 奇怪的行为

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有什么不同?

+0

您没有正确初始化'STARTUPINFO'和'PROCESS_INFORMATION'。你检查过'CloseHandle()'的返回值吗? – 2012-02-13 09:59:52

+0

CloseHandle在两种情况下返回'1'。这两个结构的哪些值必须在最小的情况下初始化? – gorootde 2012-02-13 10:08:04

+0

下面是示例:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512(v=vs.85).aspx – 2012-02-13 10:12:59

回答

1

Java解释器是一个控制台进程。有可能你的程序也是一个控制台进程,所以Java继承和共享你的控制台。这就是为什么你的过程似乎要等待Java完成。它实际上不是,只是控制台站在那里。

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

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

+0

你使我的一周;-)使用'DETACHED_PROCESS' – gorootde 2012-02-13 11:12:51