Как запустить.jar-файл с C++ без окна консоли

когда я запускаю .файл jar, как:

#include <windows.h>

using namespace std;

int main() {

    system("start javaw -splash:someImage.png -jar someFile.jar");

    return 0;
}

также я определил параметр-mwindows в компиляторе g++.

до заставки - черный консоль показывает на несколько миллисекунд. Есть ли решение, чтобы избежать этого?

4 ответов


используйте это: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs. 85).aspx

там флаг CREATE_NO_WINDOW, передайте свою команду в качестве параметров.


в вашем случае system() функция просто выполняет cmd.exe С start ... аргументов. Таким образом, черное окно консоли принадлежит started cmd процесс. The javaw программа не имеет консольного окна. И этого будет достаточно, чтобы создать новый процесс с javaw -splash:someImage.png -jar someFile.jar командная строка, как описано в Создание Процессов


мой нынешний рабочий пример на основе Эрнестас Gruodis и другим, без предупреждения

#define _WIN32_WINNT 0x0500
#include <stdio.h>
#include <tchar.h>
#include <windows.h>

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{   
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    char cmdline[] = " -jar some.jar";
    // Start the child process. 
    if( !CreateProcess( "javaw.exe",   // No module name (use command line)
        cmdline,        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        CREATE_NO_WINDOW,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi)            // Pointer to PROCESS_INFORMATION structure
    ) 
    {
        printf( "CreateProcess failed (%d).\n", GetLastError() );
        return 1;
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
    return 0;
}

компиляция с помощью MinGW

g++ test.cpp -o test.exe -Wl,--subsystem,windows

-Wl,--subsystem,windows означает отсутствие окна консоли.


мое предварительное решение теперь:

#include <windows.h>
#include <memory.h>
#include <string.h>
#include <stdio.h>
#include <tchar.h>

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {

    STARTUPINFO si;
    memset(&si, 0, sizeof (STARTUPINFO));
    si.cb = sizeof (STARTUPINFO);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = FALSE;

    PROCESS_INFORMATION pi;
    memset(&pi, 0, sizeof (PROCESS_INFORMATION));

    // Start the child process.

    if (!CreateProcess("C:\Program Files\Java\jre7\bin\javaw.exe",
            " -jar install.jar", // Command line.
            NULL, // Process handle not inheritable.
            NULL, // Thread handle not inheritable.
            0, // Set handle inheritance to FALSE.
            CREATE_NO_WINDOW, // ON VISTA/WIN7, THIS CREATES NO WINDOW
            NULL, // Use parent's environment block.
            NULL, // Use parent's starting directory.
            &si, // Pointer to STARTUPINFO structure.
            &pi)) // Pointer to PROCESS_INFORMATION structure.
    {
        printf("CreateProcess failed (%d).\n", GetLastError());
        return 0;
    }

    // Wait until child process exits.
    WaitForSingleObject(pi.hProcess, INFINITE);

    // Close process and thread handles. 
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    return 0;
}

но я получаю предупреждение:

main.cpp: в функции ' int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)': главный.cpp: 38: 16: предупреждение: устаревшее преобразование из Строковой константы в 'LPSTR {aka char*}' [- write-strings] &pi)) / / указатель на структуру PROCESS_INFORMATION.

как это можно сделать правильно и без предупреждений?

PS - Если кто-то хочет добавить значок в exe-файл - здесь это превосходные инструкции, как это сделать в IDE NetBeans. Просто введите ресурс.rc эти строки:

#include "ids.h"  
IDI_ICON ICON "nice.ico"

и в идентификаторах.H-файл:

#define IDI_ICON  101

вот и все.