summaryrefslogtreecommitdiffstats
path: root/src/entrypoint/qtentrypoint_win.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/entrypoint/qtentrypoint_win.cpp')
-rw-r--r--src/entrypoint/qtentrypoint_win.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/entrypoint/qtentrypoint_win.cpp b/src/entrypoint/qtentrypoint_win.cpp
new file mode 100644
index 0000000000..f0cf46ba3d
--- /dev/null
+++ b/src/entrypoint/qtentrypoint_win.cpp
@@ -0,0 +1,65 @@
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include <qt_windows.h>
+#include <shellapi.h>
+
+/*
+ This file contains the code in the QtEntryPoint library for Windows.
+ QtEntryPoint contains the Windows startup code and is required for
+ linking to the Qt DLL.
+
+ When a Windows application starts, the WinMain function is
+ invoked.
+*/
+
+#if defined(QT_NEEDS_QMAIN)
+int qMain(int, char **);
+#define main qMain
+#else
+extern "C" int main(int, char **);
+#endif
+
+/*
+ WinMain() - Initializes Windows and calls user's startup function main().
+ NOTE: WinMain() won't be called if the application was linked as a "console"
+ application.
+*/
+
+// Convert a wchar_t to char string, equivalent to QString::toLocal8Bit()
+// when passed CP_ACP.
+static inline char *wideToMulti(unsigned int codePage, const wchar_t *aw)
+{
+ const int required = WideCharToMultiByte(codePage, 0, aw, -1, nullptr, 0, nullptr, nullptr);
+ char *result = new char[required];
+ WideCharToMultiByte(codePage, 0, aw, -1, result, required, nullptr, nullptr);
+ return result;
+}
+
+static inline int qtEntryPoint()
+{
+ int argc = 0;
+ wchar_t **argvW = CommandLineToArgvW(GetCommandLineW(), &argc);
+ if (argvW == nullptr)
+ return -1;
+ char **argv = new char *[argc + 1];
+ for (int i = 0; i != argc; ++i)
+ argv[i] = wideToMulti(CP_ACP, argvW[i]);
+ argv[argc] = nullptr;
+ LocalFree(argvW);
+ const int exitCode = main(argc, argv);
+ for (int i = 0; (i != argc) && (argv[i] != nullptr); ++i)
+ delete [] argv[i];
+ delete [] argv;
+ return exitCode;
+}
+
+extern "C" int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
+{
+ return qtEntryPoint();
+}
+
+extern "C" int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int)
+{
+ return qtEntryPoint();
+}