diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2019-02-09 10:32:32 +0100 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2019-02-09 12:13:35 +0100 | 
| commit | e80d210dcc7e2b45656dfe29cb42e4363a088b05 (patch) | |
| tree | 3e2826a8d496cd3ccd8cf03b678dedf10636793a | |
| parent | e39a753236808603bc1e3530a7d6091eeeeacd39 (diff) | |
proto/simconnect: move activation context to compat
| -rw-r--r-- | compat/activation-context.cpp | 51 | ||||
| -rw-r--r-- | compat/activation-context.hpp | 26 | ||||
| -rw-r--r-- | proto-simconnect/ftnoir_protocol_sc.cpp | 52 | 
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); | 
