首先,这不是重复的。还有其他类似的问题,但没有一个对这个问题有效,并且似乎都不适用于升华+ gcc。
我需要开发一个.exe文件,它将启动一个可运行的.jar文件,该文件存储在名为core
的子文件夹中。我使用sublime text
和mingw
构建了c ++ .exe应用程序,它可以正常工作,但是有一个小问题需要解决。当您执行.exe文件时,在最短的时间内,您会在屏幕上看到一个黑色的窗口,该窗口在几毫秒内消失了,之后,Java .jar应用程序打开。仅当我使用此.exe时才会发生这种情况。如果我双击可运行的jar,则不会出现黑色窗口。
如何避免在几毫秒内消失的黑色窗口?
这是代码:
#include <windows.h>
int main()
{
ShellExecute(0, "open", "core.jar", NULL, "core", SW_SHOW);
return 0;
}
我也尝试使用此代码和相同的结果:
ShellExecute(0, "open", "cmd.exe", "/C .\\core\\core.jar", 0, SW_HIDE);
答案 0 :(得分:0)
使用CreateProcess()或ShellExecuteEx()将使您返回创建的进程的句柄,并使用该句柄可以杀死该进程。 这是一个显示错误处理方式的示例。
#include <windows.h>
#include <string>
#include <iostream>
void DisplayError(LPCTSTR errorDesc, DWORD errorCode)
{
TCHAR errorMessage[1024] = TEXT("");
DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_IGNORE_INSERTS
| FORMAT_MESSAGE_MAX_WIDTH_MASK;
FormatMessage(flags,
NULL,
errorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
errorMessage,
sizeof(errorMessage) / sizeof(TCHAR),
NULL);
std::cerr << "Error : " << errorDesc << "\n";
std::cerr << "Code = " << errorCode << "\n";
std::cerr << "Message = " << errorMessage << "\n";
}
int main()
{
STARTUPINFO info = { sizeof(info) };
PROCESS_INFORMATION processInfo;
ZeroMemory(&info, sizeof(info));
info.cb = sizeof(info);
ZeroMemory(&processInfo, sizeof(processInfo));
std::string path = "D:\\Java\\jdk1.6.0_26\\bin\\java.exe";
std::string cmdArgs = "java.exe -jar D:\\temp\\sample.jar";
// Start the child process.
if (CreateProcess(path.c_str(), const_cast<char *>(cmdArgs.c_str()), NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
{
// Wait until child process exits.
WaitForSingleObject(processInfo.hProcess, INFINITE);
// Close process and thread handles.
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
}
else
{
DWORD errorCode = GetLastError();
DisplayError(TEXT("Unable to execute."), errorCode);
}
//system("pause");
}
答案 1 :(得分:0)
问题不在于您对ShellExecute的调用。您的代码用于控制台应用程序。就像人们可能猜到的那样,控制台应用程序在控制台中运行(该黑色窗口;与运行cmd.exe时获得的结果相同)。
您可以将main
替换为WinMain
,然后在其中调用ShellExecute
来启动jar,并且不应出现任何控制台窗口(假设jar本身不是创建一个)。
有关如何使用MingW制作“ Windows”应用程序的信息,请参见14 B。
答案 2 :(得分:0)
最后,我发现将-mwindows
添加到gcc编译命令就足够了:
gcc -o launcher launcher.cpp -mwindows