summaryrefslogtreecommitdiffhomepage
path: root/compat/win32-com.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'compat/win32-com.cpp')
-rw-r--r--compat/win32-com.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/compat/win32-com.cpp b/compat/win32-com.cpp
new file mode 100644
index 00000000..dd7c24a8
--- /dev/null
+++ b/compat/win32-com.cpp
@@ -0,0 +1,60 @@
+#ifdef _WIN32
+
+#include "win32-com.hpp"
+
+#include <QString>
+#include <QThread>
+#include <QDebug>
+
+bool OPENTRACK_COMPAT_EXPORT init_com_threading(com_type t)
+{
+ static thread_local com_type initialized = com_type(-1);
+
+ if (initialized != com_type(-1))
+ {
+ if (t != initialized)
+ {
+ QString tp("invalid type");
+ switch (t)
+ {
+ case com_apartment:
+ tp = "apartment threaded";
+ break;
+ case com_multithreaded:
+ tp = "multithreaded";
+ break;
+ }
+
+ qDebug() << "COM for thread"
+ << QThread::currentThread() << QThread::currentThreadId()
+ << "already initialized to" << tp;
+
+ return false;
+ }
+
+ return true;
+ }
+
+ HRESULT ret = CoInitializeEx(0, t);
+
+ if (ret != S_OK && ret != S_FALSE)
+ {
+ qDebug() << "CoInitializeEx failed:" << ret << GetLastError();
+ return false;
+ }
+
+ if (t == com_apartment)
+ {
+ ret = OleInitialize(nullptr);
+
+ if (ret != S_OK && ret != S_FALSE)
+ qDebug() << "OleInitialize() failed:" << ret << GetLastError();
+
+ return false;
+ }
+
+ initialized = t;
+
+ return true;
+}
+#endif