コンソールを出さないように書き換えました。
やっぱり、Windowsアプリケーションでコンソール出力は邪道だとおもって、これもかなり怠慢ですが、Javaのコンソール出力をキャプチャして、最終的にMessageBoxで結果を表示させるように組み替えてみました。
#include "wjnicall.h" int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { std::basic_stringstream<_TCHAR> out; LPTSTR cmdLine = GetCommandLine(); SECURITY_ATTRIBUTES sa; HANDLE inRead, outWrite; char buf[1024]; DWORD readlen = 0; int cont = 1; memset(&sa, 0, sizeof(sa)); sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = 0; sa.bInheritHandle = TRUE; CreatePipe(&inRead, &outWrite, &sa, 512); SetStdHandle(STD_OUTPUT_HANDLE, outWrite); JvmEnv env; env.loadArgs(cmdLine); env.addJavaParam(String(_T("-Xms8m"))); env.addJavaParam(String(_T("-Xms16m"))); env.addJavaParam(String(_T("-server"))); env.addJavaParam(String(_T("-Djava.compiler=NONE"))); String latest = env.findJvm(JRERuntimeLib+LatestVersion, false); String msg_buff; if (env.loadJLib(latest) == 0) { env.addClassPath(_T("E:\\Workspace\\Common\\Java\\JNI\\net\\classes")); if (env.createJvm() == 0) { JvmService service = JvmService(env); service.setCallClass("IfInfoTest", "net.test"); service.execute(); do { if (service.end_wait(0) == 0) { cont = 0; break; } ReadFile(inRead, buf, 1024, &readlen, NULL); if (readlen <= 0) { cont = 0; break; } buf[readlen] = 0; msg_buff.append(String((_TCHAR*)_bstr_t((char*)buf))); } while(cont); service.setReturnCodeName("return_code"); service.result(); out << _T("Execute result ") << service.getReturnCode() << _T(":") << service.getReturnMessage() << std::endl; env.destroyJvm(); } env.unloadJLib(); } MessageBox(NULL, msg_buff.c_str(), out.str().c_str(), MB_OK); return 0; }
この方がWindowsアプリケーションらしいですかねぇ・・・。