From 8f1bd6c6c017a0e28160c5325d1c5c86a3e16384 Mon Sep 17 00:00:00 2001
From: Oliver Wolff <oliver.wolff@qt.io>
Date: Mon, 7 Aug 2017 13:25:45 +0200
Subject: [PATCH] windows: Make sure everything is properly CoInitialized on
 desktop use

Task-number: QTBUG-61566
Change-Id: I5f8ff2c3e8a841ab8c5a3fb465d0be4b003d7a2b
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
---
 src/bluetooth/qbluetoothdevicediscoveryagent_winrt.cpp | 6 ++++++
 src/bluetooth/qbluetoothserver_winrt.cpp               | 9 +++++++++
 2 files changed, 15 insertions(+)

diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_winrt.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_winrt.cpp
index 363bc438..e9641344 100644
--- a/src/bluetooth/qbluetoothdevicediscoveryagent_winrt.cpp
+++ b/src/bluetooth/qbluetoothdevicediscoveryagent_winrt.cpp
@@ -133,6 +133,9 @@ QWinRTBluetoothDeviceDiscoveryWorker::QWinRTBluetoothDeviceDiscoveryWorker(QBlue
 {
     qRegisterMetaType<QBluetoothDeviceInfo>();
 
+#ifdef CLASSIC_APP_BUILD
+    CoInitialize(NULL);
+#endif
     HRESULT hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Devices_Bluetooth_BluetoothDevice).Get(), &m_deviceStatics);
     Q_ASSERT_SUCCEEDED(hr);
     hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Devices_Bluetooth_BluetoothLEDevice).Get(), &m_leDeviceStatics);
@@ -142,6 +145,9 @@ QWinRTBluetoothDeviceDiscoveryWorker::QWinRTBluetoothDeviceDiscoveryWorker(QBlue
 QWinRTBluetoothDeviceDiscoveryWorker::~QWinRTBluetoothDeviceDiscoveryWorker()
 {
     stop();
+#ifdef CLASSIC_APP_BUILD
+    CoUninitialize();
+#endif
 }
 
 void QWinRTBluetoothDeviceDiscoveryWorker::start()
diff --git a/src/bluetooth/qbluetoothserver_winrt.cpp b/src/bluetooth/qbluetoothserver_winrt.cpp
index f478dc93..08aa45b4 100644
--- a/src/bluetooth/qbluetoothserver_winrt.cpp
+++ b/src/bluetooth/qbluetoothserver_winrt.cpp
@@ -73,6 +73,9 @@ QHash<QBluetoothServerPrivate *, int> __fakeServerPorts;
 QBluetoothServerPrivate::QBluetoothServerPrivate(QBluetoothServiceInfo::Protocol sType)
     : maxPendingConnections(1), serverType(sType), m_lastError(QBluetoothServer::NoError), socket(0)
 {
+#ifdef CLASSIC_APP_BUILD
+    CoInitialize(NULL);
+#endif
     socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
 }
 
@@ -82,6 +85,12 @@ QBluetoothServerPrivate::~QBluetoothServerPrivate()
     __fakeServerPorts.remove(this);
     if (socket)
         delete socket;
+#ifdef CLASSIC_APP_BUILD
+    // If we do not reset that pointer, socketListener will go out of scope after CoUninitialize was
+    // called, which will lead to a crash.
+    socketListener = nullptr;
+    CoUninitialize();
+#endif
 }
 
 bool QBluetoothServerPrivate::isListening() const
-- 
GitLab