0

我需要开发一个 .exe 文件,该文件将启动一个可运行的 .jar 文件,该文件存储在名为core. sublime text我用and构建了 C++ .exe 应用程序,mingw它工作正常,但有一个小问题需要解决。当您执行 .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);

我知道还有其他类似的问题,但没有一个适用于这个问题,而且似乎都不适用于 Sublime 和 gcc。

4

3 回答 3

0

最后我发现添加-mwindows到 gcc 编译命令就足够了:

gcc -o launcher launcher.cpp -mwindows
于 2019-01-05T18:32:48.277 回答
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");
}
于 2019-01-05T00:57:29.880 回答
0

问题不在于您对 ShellExecute 的调用。您的代码用于控制台应用程序。正如人们可能猜到的那样,控制台应用程序在控制台中运行(那个黑色窗口;与运行 cmd.exe 时得到的相同)。

您可以替换mainWinMain,然后简单地调用ShellExecute那里来启动 jar,并且应该没有结果控制台窗口(假设 jar 本身没有创建一个)。

有关如何使用 MingW 制作“windows”应用程序的信息,请参阅14 B。

于 2019-01-05T00:59:17.467 回答