Added support for loading a custom application title from the resources.

This commit is contained in:
LoRd_MuldeR 2020-09-28 19:57:32 +02:00
parent 042a8484b0
commit 34bf1de269
4 changed files with 32 additions and 20 deletions

View File

@ -72,12 +72,15 @@ It is *not* necessary (though possible) to re-build the executable files for tha
Some options can be configured via the launcher executable's [STRINGTABLE](https://docs.microsoft.com/en-us/windows/win32/menurc/stringtable-resource) resource: Some options can be configured via the launcher executable's [STRINGTABLE](https://docs.microsoft.com/en-us/windows/win32/menurc/stringtable-resource) resource:
* **`ID_STR_JVMARGS` (#1)** * **`ID_STR_HEADING` (#1)**
Specifies a custom application description that will be used, for example, as title of message boxes.
* **`ID_STR_JVMARGS` (#2)**
Specifies *additional* options JVM options to be passed, e.g. `-Xmx2g` or `-Dproperty=value`. Specifies *additional* options JVM options to be passed, e.g. `-Xmx2g` or `-Dproperty=value`.
See here for a list of available options: See here for a list of available options:
https://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html https://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html
* **`ID_STR_CMDARGS` (#2)** * **`ID_STR_CMDARGS` (#3)**
Specifies *additional* (fixed) command-line options to be passed to the application. Specifies *additional* (fixed) command-line options to be passed to the application.
*Note:* The default value `"?"` means "nothing" should be passed, because resource strings cannot be empty! *Note:* The default value `"?"` means "nothing" should be passed, because resource strings cannot be empty!

View File

@ -37,8 +37,9 @@ ID_ICON_MAIN ICON "assets/icon.ico"
STRINGTABLE STRINGTABLE
BEGIN BEGIN
ID_STR_JVMARGS L"?" /*-Xmx512m*/ ID_STR_HEADING L"?" /*custom application title*/
ID_STR_CMDARGS L"?" ID_STR_JVMARGS L"?" /*additional JVM args*/
ID_STR_CMDARGS L"?" /*additional command-line args*/
END END
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////

View File

@ -803,7 +803,7 @@ static int show_message_format(HWND hwnd, const DWORD flags, const wchar_t *cons
return result; return result;
} }
static void show_jre_download_notice(const HWND hwnd) static void show_jre_download_notice(const HWND hwnd, const wchar_t *const title)
{ {
const DWORD REQUIRED_VERSION[] = const DWORD REQUIRED_VERSION[] =
{ {
@ -865,10 +865,13 @@ static void destroy_window(HWND *const hwnd)
/* MAIN */ /* MAIN */
/* ======================================================================== */ /* ======================================================================== */
static wchar_t *const DEFAULT_HEADING = L"Launch5j";
#define APP_HEADING (AVAILABLE(app_heading) ? app_heading : DEFAULT_HEADING)
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{ {
int result = -1; int result = -1;
const wchar_t *executable_path = NULL, *executable_directory = NULL, *jarfile_path = NULL, *java_runtime_path = NULL, *jvm_extra_args = NULL, *cmd_extra_args = NULL, *command_line = NULL; const wchar_t *app_heading = NULL, *executable_path = NULL, *executable_directory = NULL, *jarfile_path = NULL, *java_runtime_path = NULL, *jvm_extra_args = NULL, *cmd_extra_args = NULL, *command_line = NULL;
HGDIOBJ splash_image = NULL; HGDIOBJ splash_image = NULL;
PROCESS_INFORMATION process_info; PROCESS_INFORMATION process_info;
STARTUPINFOW startup_info; STARTUPINFOW startup_info;
@ -877,8 +880,11 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
SecureZeroMemory(&startup_info, sizeof(STARTUPINFOW)); SecureZeroMemory(&startup_info, sizeof(STARTUPINFOW));
SecureZeroMemory(&process_info, sizeof(PROCESS_INFORMATION)); SecureZeroMemory(&process_info, sizeof(PROCESS_INFORMATION));
// Load title
app_heading = load_string(hInstance, ID_STR_HEADING);
// Create the window // Create the window
HWND hwnd = CreateWindowExW(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, L"STATIC", L"", WS_POPUP | SS_BITMAP, 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); HWND hwnd = CreateWindowExW(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, L"STATIC", APP_HEADING, WS_POPUP | SS_BITMAP, 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
// Show the splash screen // Show the splash screen
#if ENABLE_SPLASH #if ENABLE_SPLASH
@ -894,14 +900,14 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
// Find executable path // Find executable path
if (!(executable_path = get_executable_path())) if (!(executable_path = get_executable_path()))
{ {
show_message(hwnd, MB_ICONERROR | MB_TOPMOST, L"System Error", L"The path of the executable could not be determined!"); show_message(hwnd, MB_ICONERROR | MB_TOPMOST, APP_HEADING, L"The path of the executable could not be determined!");
goto cleanup; goto cleanup;
} }
// Find executable directory // Find executable directory
if (!(executable_directory = get_executable_directory(executable_path))) if (!(executable_directory = get_executable_directory(executable_path)))
{ {
show_message(hwnd, MB_ICONERROR | MB_TOPMOST, L"System Error", L"The executable directory could not be determined!"); show_message(hwnd, MB_ICONERROR | MB_TOPMOST, APP_HEADING, L"The executable directory could not be determined!");
goto cleanup; goto cleanup;
} }
@ -914,7 +920,7 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
// Find the JAR file path // Find the JAR file path
if (!(jarfile_path = get_jarfile_path(executable_path, executable_directory))) if (!(jarfile_path = get_jarfile_path(executable_path, executable_directory)))
{ {
show_message(hwnd, MB_ICONERROR | MB_TOPMOST, L"System Error", L"The path of the JAR file could not be determined!"); show_message(hwnd, MB_ICONERROR | MB_TOPMOST, APP_HEADING, L"The path of the JAR file could not be determined!");
goto cleanup; goto cleanup;
} }
@ -922,7 +928,7 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
#if !JAR_FILE_WRAPPED #if !JAR_FILE_WRAPPED
if (!file_exists(jarfile_path)) if (!file_exists(jarfile_path))
{ {
show_message_format(hwnd, MB_ICONERROR | MB_TOPMOST, L"JAR not found", L"The required JAR file could not be found:\n\n%ls\n\n\nRe-installing the application may fix the problem!", jarfile_path); show_message_format(hwnd, MB_ICONERROR | MB_TOPMOST, APP_HEADING, L"The required JAR file could not be found:\n\n%ls\n\n\nRe-installing the application may fix the problem!", jarfile_path);
goto cleanup; goto cleanup;
} }
#endif #endif
@ -931,19 +937,19 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
#if DETECT_REGISTRY #if DETECT_REGISTRY
if (!(java_runtime_path = detect_java_runtime())) if (!(java_runtime_path = detect_java_runtime()))
{ {
show_message(hwnd, MB_ICONERROR | MB_TOPMOST, L"JRE not found", L"Java Runtime Environment (JRE) could not be found!"); show_message(hwnd, MB_ICONERROR | MB_TOPMOST, APP_HEADING, L"Java Runtime Environment (JRE) could not be found!");
show_jre_download_notice(hwnd); show_jre_download_notice(hwnd, APP_HEADING);
goto cleanup; goto cleanup;
} }
#else #else
if (!(java_runtime_path = awprintf(L"%ls\\%ls", executable_directory, JRE_RELATIVE_PATH))) if (!(java_runtime_path = awprintf(L"%ls\\%ls", executable_directory, JRE_RELATIVE_PATH)))
{ {
show_message(hwnd, MB_ICONERROR | MB_TOPMOST, L"System Error", L"The path of the Java runtime could not be determined!"); show_message(hwnd, MB_ICONERROR | MB_TOPMOST, APP_HEADING, L"The path of the Java runtime could not be determined!");
goto cleanup; goto cleanup;
} }
if (!file_exists(java_runtime_path)) if (!file_exists(java_runtime_path))
{ {
show_message_format(hwnd, MB_ICONERROR | MB_TOPMOST, L"JRE not found", L"The required Java runtime could not be found:\n\n%ls\n\n\nRe-installing the application may fix the problem!", java_runtime_path); show_message_format(hwnd, MB_ICONERROR | MB_TOPMOST, APP_HEADING, L"The required Java runtime could not be found:\n\n%ls\n\n\nRe-installing the application may fix the problem!", java_runtime_path);
goto cleanup; goto cleanup;
} }
#endif #endif
@ -962,7 +968,7 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
: awprintf(NOT_EMPTY(pCmdLine) ? L"\"%ls\" -jar \"%ls\" %ls" : L"\"%ls\" -jar \"%ls\"", java_runtime_path, jarfile_path, pCmdLine)); : awprintf(NOT_EMPTY(pCmdLine) ? L"\"%ls\" -jar \"%ls\" %ls" : L"\"%ls\" -jar \"%ls\"", java_runtime_path, jarfile_path, pCmdLine));
if (!command_line) if (!command_line)
{ {
show_message(hwnd, MB_ICONERROR | MB_TOPMOST, L"System Error", L"The Java command-line could not be generated!"); show_message(hwnd, MB_ICONERROR | MB_TOPMOST, APP_HEADING, L"The Java command-line could not be generated!");
goto cleanup; goto cleanup;
} }
@ -977,12 +983,12 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
const wchar_t *const error_text = describe_system_error(GetLastError()); const wchar_t *const error_text = describe_system_error(GetLastError());
if (error_text) if (error_text)
{ {
show_message_format(hwnd, MB_ICONERROR | MB_TOPMOST, L"System Error", L"Failed to create the Java process:\n\n%ls\n\n\n%ls", command_line, error_text); show_message_format(hwnd, MB_ICONERROR | MB_TOPMOST, APP_HEADING, L"Failed to create the Java process:\n\n%ls\n\n\n%ls", command_line, error_text);
free((void*)error_text); free((void*)error_text);
} }
else else
{ {
show_message_format(hwnd, MB_ICONERROR | MB_TOPMOST, L"System Error", L"Failed to create the Java process:\n\n%ls", command_line); show_message_format(hwnd, MB_ICONERROR | MB_TOPMOST, APP_HEADING, L"Failed to create the Java process:\n\n%ls", command_line);
} }
goto cleanup; goto cleanup;
} }
@ -1025,6 +1031,7 @@ cleanup:
free((void*)jarfile_path); free((void*)jarfile_path);
free((void*)executable_directory); free((void*)executable_directory);
free((void*)executable_path); free((void*)executable_path);
free((void*)app_heading);
return result; return result;
} }

View File

@ -18,5 +18,6 @@
#define ID_BITMAP_SPLASH 1 #define ID_BITMAP_SPLASH 1
// STRINGS // STRINGS
#define ID_STR_JVMARGS 1 #define ID_STR_HEADING 1
#define ID_STR_CMDARGS 2 #define ID_STR_JVMARGS 2
#define ID_STR_CMDARGS 3