Проблема при попытке запустить исполняемый файл JAR из приложения C ++ - PullRequest
0 голосов
/ 05 января 2019

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

Ответы [ 3 ]

0 голосов
/ 05 января 2019

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

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

См. 14 B , чтобы узнать, как создать приложение для Windows с MingW.

0 голосов
/ 05 января 2019

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

gcc -o launcher launcher.cpp -mwindows
0 голосов
/ 05 января 2019

Используйте 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");
}
...