summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--compat/activation-context.cpp51
-rw-r--r--compat/activation-context.hpp26
-rw-r--r--proto-simconnect/ftnoir_protocol_sc.cpp52
3 files changed, 80 insertions, 49 deletions
diff --git a/compat/activation-context.cpp b/compat/activation-context.cpp
new file mode 100644
index 00000000..8d34243d
--- /dev/null
+++ b/compat/activation-context.cpp
@@ -0,0 +1,51 @@
+#ifdef _WIN32
+
+#include "activation-context.hpp"
+#include "compat/library-path.hpp"
+
+#include <QString>
+#include <QFile>
+#include <QDebug>
+
+#include <windows.h>
+
+static_assert(sizeof(std::uintptr_t) == sizeof(ULONG_PTR));
+
+activation_context::activation_context(const QString& module_name, int resid)
+{
+ static const QString prefix = OPENTRACK_BASE_PATH + OPENTRACK_LIBRARY_PATH + OPENTRACK_LIBRARY_PREFIX;
+ QString path = prefix + module_name;
+ QByteArray name = QFile::encodeName(path);
+
+ ACTCTXA actx = {};
+ actx.cbSize = sizeof(actx);
+ actx.lpResourceName = MAKEINTRESOURCEA(resid);
+ actx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID;
+ actx.lpSource = name.constData();
+
+ handle = CreateActCtxA(&actx);
+
+ if (handle != INVALID_HANDLE_VALUE)
+ {
+ if (!ActivateActCtx(handle, (ULONG_PTR*)&cookie))
+ {
+ qDebug() << "win32: can't set activation context" << GetLastError();
+ ReleaseActCtx(handle);
+ handle = INVALID_HANDLE_VALUE;
+ }
+ else
+ ok = true;
+ } else {
+ qDebug() << "win32: can't create activation context" << GetLastError();
+ }
+}
+
+activation_context::~activation_context()
+{
+ if (handle != INVALID_HANDLE_VALUE)
+ {
+ DeactivateActCtx(0, cookie);
+ ReleaseActCtx(handle);
+ }
+}
+#endif
diff --git a/compat/activation-context.hpp b/compat/activation-context.hpp
new file mode 100644
index 00000000..a3b0429e
--- /dev/null
+++ b/compat/activation-context.hpp
@@ -0,0 +1,26 @@
+#pragma once
+
+#ifdef _WIN32
+
+#include "export.hpp"
+
+#include <cstdint>
+#include <QString>
+
+class OTR_COMPAT_EXPORT activation_context
+{
+public:
+ explicit activation_context(const QString& module_name, int resid);
+ ~activation_context();
+
+ explicit operator bool() const { return ok; }
+
+private:
+ std::uintptr_t cookie = 0;
+ void* handle = (void*)-1;
+ bool ok = false;
+};
+
+#else
+# error "tried to use win32-only activation context"
+#endif
diff --git a/proto-simconnect/ftnoir_protocol_sc.cpp b/proto-simconnect/ftnoir_protocol_sc.cpp
index 800c22ff..734e10ba 100644
--- a/proto-simconnect/ftnoir_protocol_sc.cpp
+++ b/proto-simconnect/ftnoir_protocol_sc.cpp
@@ -13,6 +13,7 @@
#include "api/plugin-api.hpp"
#include "compat/timer.hpp"
#include "compat/library-path.hpp"
+#include "compat/activation-context.hpp"
simconnect::~simconnect()
{
@@ -101,62 +102,15 @@ void simconnect::pose( const double *headpose )
virtSCPosZ = float(-headpose[TZ]/100);
}
-class ActivationContext
-{
-public:
- explicit ActivationContext(int resid);
- ~ActivationContext();
-
- bool is_ok() const { return ok; }
-
-private:
- ULONG_PTR cookie = 0;
- HANDLE handle = INVALID_HANDLE_VALUE;
- bool ok = false;
-};
-
-ActivationContext::ActivationContext(int resid)
-{
- ACTCTXA actx = {};
- actx.cbSize = sizeof(actx);
- actx.lpResourceName = MAKEINTRESOURCEA(resid);
- actx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID;
- static const QString prefix = OPENTRACK_BASE_PATH + OPENTRACK_LIBRARY_PATH;
- QString path = prefix + OPENTRACK_LIBRARY_PREFIX "opentrack-proto-simconnect." OPENTRACK_LIBRARY_EXTENSION;
- QByteArray name = QFile::encodeName(path);
- actx.lpSource = name.constData();
- handle = CreateActCtxA(&actx);
- if (handle != INVALID_HANDLE_VALUE)
- {
- if (!ActivateActCtx(handle, &cookie))
- {
- qDebug() << "simconnect: can't set win32 activation context" << GetLastError();
- ReleaseActCtx(handle);
- handle = INVALID_HANDLE_VALUE;
- }
- else
- ok = true;
- } else {
- qDebug() << "simconnect: can't create win32 activation context" << GetLastError();
- }
-}
-
-ActivationContext::~ActivationContext()
-{
- if (handle != INVALID_HANDLE_VALUE)
- {
- DeactivateActCtx(0, cookie);
- ReleaseActCtx(handle);
- }
}
module_status simconnect::initialize()
{
if (!library.isLoaded())
{
- ActivationContext ctx(142 + s.sxs_manifest);
+ activation_context ctx("opentrack-proto-simconnect" "." OPENTRACK_LIBRARY_EXTENSION, 142 + s.sxs_manifest);
- if (ctx.is_ok())
+ if (ctx)
{
library.setFileName("SimConnect.dll");
library.setLoadHints(QLibrary::PreventUnloadHint | QLibrary::ResolveAllSymbolsHint);