Прежде всего, это не дубликат. Есть и другие подобные вопросы, но ни один из них не подходит для этой проблемы, и ни один из них, кажется, не подходит для sublime + gcc.
Мне нужно разработать файл .exe, который запустит исполняемый файл .jar, который хранится в подпапке с именем core
, Я создал приложение c ++ .exe с sublime text
а также mingw
и работает нормально, но есть небольшая проблема, которую мне нужно решить. Когда вы выполняете файл .exe, в течение минимального промежутка времени вы можете увидеть черное окно на экране, которое исчезает через несколько миллисекунд, а после него открывается приложение java .jar. Это происходит только если я использую этот .exe. Если я дважды щелкну в работающей банке, черное окно не появится.
Как я могу избежать того черного окна, которое исчезает через несколько миллисекунд?
Это код:
#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);
Проблема не в вашем звонке в ShellExecute. Ваш код для консольного приложения. Консольные приложения, как можно догадаться, запускаются в консоли (это черное окно; то же самое, что вы получили бы, если бы запускали cmd.exe).
Вы можете просто заменить main
с WinMain
и просто позвони ShellExecute
там, чтобы запустить jar, и не должно быть получающегося окна консоли (при условии, что сам jar не создает его).
Увидеть 14 Б о том, как сделать приложение для Windows с MingW.
Используйте 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");
}
Наконец я обнаружил, что достаточно с добавлением -mwindows
к команде компиляции gcc:
gcc -o launcher launcher.cpp -mwindows