Проблема при попытке запустить исполняемый файл JAR из приложения C ++

Прежде всего, это не дубликат. Есть и другие подобные вопросы, но ни один из них не подходит для этой проблемы, и ни один из них, кажется, не подходит для 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);

0

Решение

Проблема не в вашем звонке в ShellExecute. Ваш код для консольного приложения. Консольные приложения, как можно догадаться, запускаются в консоли (это черное окно; то же самое, что вы получили бы, если бы запускали cmd.exe).

Вы можете просто заменить main с WinMainи просто позвони ShellExecute там, чтобы запустить jar, и не должно быть получающегося окна консоли (при условии, что сам jar не создает его).

Увидеть 14 Б о том, как сделать приложение для Windows с MingW.

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");
}
0

Наконец я обнаружил, что достаточно с добавлением -mwindows к команде компиляции gcc:

gcc -o launcher launcher.cpp -mwindows
0
По вопросам рекламы [email protected]