2012-02-13 95 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