summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/winmain/qtmain_winrt.cpp52
-rw-r--r--src/winmain/winmain.pro1
2 files changed, 37 insertions, 16 deletions
diff --git a/src/winmain/qtmain_winrt.cpp b/src/winmain/qtmain_winrt.cpp
index 8ad5f56bee..09efd01667 100644
--- a/src/winmain/qtmain_winrt.cpp
+++ b/src/winmain/qtmain_winrt.cpp
@@ -44,11 +44,22 @@
linking to the Qt DLL.
When a Windows application starts, the WinMain function is
- invoked. WinMain creates the WinRT application which in turn
- calls the main entry point.
+ invoked. This WinMain creates the WinRT application
+ container, which in turn calls the application's main()
+ entry point within the newly created GUI thread.
*/
-extern "C" int main(int, char **);
+#include <new.h>
+
+typedef struct
+{
+ int newmode;
+} _startupinfo;
+
+extern "C" {
+ int __getmainargs(int *argc, char ***argv, char ***env, int expandWildcards, _startupinfo *info);
+ int main(int, char **);
+}
#include <qbytearray.h>
#include <qstring.h>
@@ -69,19 +80,17 @@ typedef ITypedEventHandler<Core::CoreApplicationView *, Activation::IActivatedEv
class AppContainer : public Microsoft::WRL::RuntimeClass<Core::IFrameworkView>
{
public:
- AppContainer(int argc, wchar_t **argv) : m_argc(argc), m_debugWait(false)
+ AppContainer(int argc, char *argv[]) : m_argc(argc), m_debugWait(false)
{
m_argv.reserve(argc);
- for (int i = 0; i < argc; ++i) {
- QByteArray arg = QString::fromWCharArray(argv[i]).toLocal8Bit();
- m_argv.append(qstrdup(arg.constData()));
- }
+ for (int i = 0; i < argc; ++i)
+ m_argv.append(argv[i]);
}
~AppContainer()
{
- foreach (const char *arg, m_argv)
- delete[] arg;
+ for (int i = m_argc; i < m_argv.size(); ++i)
+ delete[] m_argv[i];
}
// IFrameworkView Methods
@@ -136,19 +145,32 @@ private:
class AppViewSource : public Microsoft::WRL::RuntimeClass<Core::IFrameworkViewSource>
{
public:
- AppViewSource(int argc, wchar_t *argv[]) : argc(argc), argv(argv) { }
+ AppViewSource(int argc, char **argv) : m_argc(argc), m_argv(argv) { }
HRESULT __stdcall CreateView(Core::IFrameworkView **frameworkView)
{
- return (*frameworkView = Make<AppContainer>(argc, argv).Detach()) ? S_OK : E_OUTOFMEMORY;
+ return (*frameworkView = Make<AppContainer>(m_argc, m_argv).Detach()) ? S_OK : E_OUTOFMEMORY;
}
private:
- int argc;
- wchar_t **argv;
+ int m_argc;
+ char **m_argv;
};
// Main entry point for Appx containers
-int wmain(int argc, wchar_t *argv[])
+int WinMain()
{
+ int argc = 0;
+ char **argv, **env;
+ _startupinfo info = { _query_new_mode() };
+ if (int init = __getmainargs(&argc, &argv, &env, false, &info))
+ return init;
+
+ for (int i = 0; env && env[i]; ++i) {
+ QByteArray var(env[i]);
+ int split = var.indexOf('=');
+ if (split > 0)
+ qputenv(var.mid(0, split), var.mid(split + 1));
+ }
+
if (FAILED(RoInitialize(RO_INIT_MULTITHREADED)))
return 1;
diff --git a/src/winmain/winmain.pro b/src/winmain/winmain.pro
index b0771caa55..1aca8996ad 100644
--- a/src/winmain/winmain.pro
+++ b/src/winmain/winmain.pro
@@ -17,7 +17,6 @@ win32-msvc*:QMAKE_CXXFLAGS_DEBUG *= -Z7
win32-g++*: DEFINES += QT_NEEDS_QMAIN
winrt {
- QMAKE_LFLAGS += /ENTRY:wmainCRTStartup
SOURCES = qtmain_winrt.cpp
} else {
SOURCES = qtmain_win.cpp