2012-02-13 19 views
2

私は単純にjava -jarを実行するアプリケーションを作成しました。 CreateProcessAを実行した直後にスターターアプリケーションを終了します。CreateProcess blocking - strange behavior

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); 

I'amはIDEを経由して、これを実行した場合には(Netbeansの7)すべてが正常に動作します。javaは、スターターが終了しながら実行し続けます。 同じexeをダブルクリックして実行している場合、javaはjarを起動しますが、スターターはJavaプロセスが終了するのを待ちます。

IDEで実行しているときとスタンドアロンで実行しているときのCreateProcessとの違いは何ですか?

+0

あなたは 'STARTUPINFO'と' PROCESS_INFORMATION'を適切に初期化していません。 'CloseHandle()'の戻り値をチェックしましたか? –

+0

CloseHandleはどちらの場合も '1'を返します。これら両方の構造体のどの値を、最小限の場合に初期化する必要がありますか? – gorootde

+0

ここに例があります:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512(v=vs.85).aspx –

答えて

1

Javaインタープリタはコンソールプロセスです。プログラムがコンソールプロセスである可能性もあるので、Javaはコンソールを継承して共有します。そのため、あなたのプロセスはJavaが終了するのを待っているようです。それは実際には、コンソールだけがそこに立っていません。

IDEからプログラムを実行すると、おそらくコンソールが特別な方法で処理され、プログラムが終了すると消えます。または、出力をリダイレクトし、最初にコンソールを非表示にすることもできます。

解決策:新しいプロセスのコンソールを処理するには、hereと定義されたフラグのいくつかを使用してください。 CREATE_NEW_CONSOLEまたはDETACHED_PROCESSまたはおそらくCREATE_NO_WINDOWを試してください。

+0

あなたは私の週を作った;-) 'DETACHED_PROCESS' – gorootde