Как запустить.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
вот и все.