summaryrefslogtreecommitdiffstats
path: root/src/common/windows/com.c
diff options
context:
space:
mode:
authorsumuel <samuel@yakubos.org>2026-08-17 20:44:55 +0000
committersumuel <samuel@yakubos.org>2026-08-17 20:44:55 +0000
commit76424950e373d3b04ac3dd13019151bfba3e8423 (patch)
tree4c3cfdbda039e592b9186be3e28f8d7cfd439e8a /src/common/windows/com.c
Add the files
Diffstat (limited to 'src/common/windows/com.c')
-rw-r--r--src/common/windows/com.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/common/windows/com.c b/src/common/windows/com.c
new file mode 100644
index 0000000..a400ca9
--- /dev/null
+++ b/src/common/windows/com.c
@@ -0,0 +1,67 @@
+#include "com.h"
+
+#include <stdlib.h>
+
+#if FF_HAVE_WINRT
+ #include <roapi.h>
+
+static void RoUninitializeWrap(void) {
+ RoUninitialize();
+}
+
+static const char* doInitCom() {
+ HRESULT res = RoInitialize(RO_INIT_MULTITHREADED);
+ if (FAILED(res)) {
+ switch (res) {
+ case E_INVALIDARG:
+ return "RoInitialize() failed: invalid argument";
+ case E_OUTOFMEMORY:
+ return "RoInitialize() failed: out of memory";
+ case E_UNEXPECTED:
+ return "RoInitialize() failed: unexpected error";
+ case RPC_E_CHANGED_MODE:
+ // COM was already initialized with a different concurrency model
+ return NULL;
+ default:
+ return "RoInitialize() failed: unknown error";
+ }
+ }
+
+ atexit(RoUninitializeWrap);
+ return NULL;
+}
+#else
+ #include <combaseapi.h>
+
+static void CoUninitializeWrap(void) {
+ CoUninitialize();
+}
+
+static const char* doInitCom() {
+ HRESULT res = CoInitializeEx(NULL, COINIT_MULTITHREADED);
+ if (FAILED(res)) {
+ switch (res) {
+ case E_INVALIDARG:
+ return "CoInitializeEx() failed: invalid argument";
+ case E_OUTOFMEMORY:
+ return "CoInitializeEx() failed: out of memory";
+ case RPC_E_CHANGED_MODE:
+ // COM was already initialized with a different concurrency model
+ return NULL;
+ default:
+ return "CoInitializeEx() failed: unknown error";
+ }
+ }
+
+ atexit(CoUninitializeWrap);
+ return NULL;
+}
+#endif
+
+const char* ffInitCom(void) {
+ static const char* error = "";
+ if (error && error[0] == '\0') {
+ error = doInitCom();
+ }
+ return error;
+}