diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/winmain/qtmain_winrt.cpp | 52 | ||||
-rw-r--r-- | src/winmain/winmain.pro | 1 |
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 |