diff options
Diffstat (limited to 'compat')
| -rw-r--r-- | compat/activation-context.cpp | 51 | ||||
| -rw-r--r-- | compat/activation-context.hpp | 26 | 
2 files changed, 77 insertions, 0 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 | 
