summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMaurice Kalinowski <maurice.kalinowski@digia.com>2013-12-31 00:21:08 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-06 12:44:01 +0100
commit3227929d21416d3ff68443a5257eb6337f84baed (patch)
tree13abfe629b56b4a4033d61cee87bc053ca452048 /src
parentbdd3ead8270dfde12b0b4eb57125a22e51ee88ce (diff)
Change entry point for WinRT apps to WinMain
Using wmain causes the problem that the linker seems to create some code around it, which calls ExitProcess. That function however is forbidden by the Windows Store Certification process and hence you cannot publish an application currently. This does not apply to Windows Phone, which links in such a way that this problem does not occur there. With WinMain as the entry point this does not happen and also is the default entry point. Testing locally shows that certification goes fine. Since it does not pass the full command line string, the C-runtime method __getmainargs is used instead. This also gives access to any environment strings which may be passed. Note that MSDN states that this function should only be used for desktop applications. For XAML/C++ scenarios there is no entry function at all, but rather the App object gets instantiated in the default template. But this only works for XAML itself and not for plain C++ applications, probably some other entry wrapper is created on the fly here. Done-with: Andrew Knight <andrew.knight@digia.com> Change-Id: I8a118eddf6cfeddeca7d676267e979af17123e02 Reviewed-by: Maurice Kalinowski <maurice.kalinowski@digia.com> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com> Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
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