WinRT: Gracefully exit an application
While it is not recommended by Microsoft to manually exit an application, currently applications just hang when exiting main(). Instead when QCoreApplication::exit() is called use the CoreApplication to properly invoke native Exit() and let the application completely shut down. Add a warning to notify developer about this non-standard behavior, as usually the system is supposed to take care of suspending and closing. Certification still passes for Windows RT and Windows Phone. Task-number: QTBUG-43862 Change-Id: Ia34443ea75daaaeca0bee2a0c9fcc568c0659262 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
This commit is contained in:
parent
5f6bbce4be
commit
8c3ae221e6
@ -81,6 +81,11 @@
|
|||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
# ifdef Q_OS_WINRT
|
# ifdef Q_OS_WINRT
|
||||||
# include "qeventdispatcher_winrt_p.h"
|
# include "qeventdispatcher_winrt_p.h"
|
||||||
|
# include "qfunctions_winrt.h"
|
||||||
|
# include <wrl.h>
|
||||||
|
# include <Windows.ApplicationModel.core.h>
|
||||||
|
using namespace ABI::Windows::ApplicationModel::Core;
|
||||||
|
using namespace Microsoft::WRL;
|
||||||
# else
|
# else
|
||||||
# include "qeventdispatcher_win_p.h"
|
# include "qeventdispatcher_win_p.h"
|
||||||
# endif
|
# endif
|
||||||
@ -1221,6 +1226,19 @@ void QCoreApplication::exit(int returnCode)
|
|||||||
QEventLoop *eventLoop = data->eventLoops.at(i);
|
QEventLoop *eventLoop = data->eventLoops.at(i);
|
||||||
eventLoop->exit(returnCode);
|
eventLoop->exit(returnCode);
|
||||||
}
|
}
|
||||||
|
#ifdef Q_OS_WINRT
|
||||||
|
qWarning("QCoreApplication::exit: It is not recommended to explicitly exit an application on Windows Store Apps");
|
||||||
|
ComPtr<ICoreApplication> app;
|
||||||
|
HRESULT hr = RoGetActivationFactory(Wrappers::HString::MakeReference(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication).Get(),
|
||||||
|
IID_PPV_ARGS(&app));
|
||||||
|
RETURN_VOID_IF_FAILED("Could not acquire ICoreApplication object");
|
||||||
|
ComPtr<ICoreApplicationExit> appExit;
|
||||||
|
|
||||||
|
hr = app.As(&appExit);
|
||||||
|
RETURN_VOID_IF_FAILED("Could not acquire ICoreApplicationExit object");
|
||||||
|
hr = appExit->Exit();
|
||||||
|
RETURN_VOID_IF_FAILED("Could not exit application");
|
||||||
|
#endif // Q_OS_WINRT
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
Loading…
x
Reference in New Issue
Block a user