尝试从C ++应用程序启动可运行jar时出现问题

时间:2019-01-05 00:18:52

标签: c++ jar exec runnable shellexecute

首先,这不是重复的。还有其他类似的问题,但没有一个对这个问题有效,并且似乎都不适用于升华+ gcc。

我需要开发一个.exe文件,它将启动一个可运行的.jar文件,该文件存储在名为core的子文件夹中。我使用sublime textmingw构建了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);

3 个答案:

答案 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