move module loading functions out of shortcutcreator.cpp
This commit is contained in:
parent
e8d84d2eda
commit
8f8dfa2e70
|
@ -40,6 +40,7 @@ set(WINDOWS_API_SOURCES
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/api/src/gobject/winrt.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/api/src/gobject/winrt.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/api/src/win32.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/api/src/win32.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/api/src/converter.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/api/src/converter.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/api/src/dyn_mod.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/api/src/ginvoke.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/api/src/ginvoke.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/api/src/shortcutcreator.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/api/src/shortcutcreator.cpp
|
||||||
)
|
)
|
||||||
|
|
29
plugins/windows-notification/api/include/dyn_mod.hpp
Normal file
29
plugins/windows-notification/api/include/dyn_mod.hpp
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
|
||||||
|
#ifndef DYN_MOD_HPP
|
||||||
|
#define DYN_MOD_HPP
|
||||||
|
|
||||||
|
namespace dyn_mod
|
||||||
|
{
|
||||||
|
using punny_func = void();
|
||||||
|
|
||||||
|
punny_func &load_symbol(
|
||||||
|
const wchar_t *mod_path,
|
||||||
|
const char *mod_dbgnym,
|
||||||
|
const char *symbol);
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline T &load_symbol(
|
||||||
|
const wchar_t *const mod_path, const char *const mod_dbgnym,
|
||||||
|
const char *const symbol)
|
||||||
|
{
|
||||||
|
return reinterpret_cast<T &>(load_symbol(mod_path, mod_dbgnym, symbol));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define dyn_load_symbol_ns(mod_name, namespace, symbol) \
|
||||||
|
::dyn_mod::load_symbol<decltype(namespace::symbol)>( \
|
||||||
|
L ## mod_name, mod_name, #symbol)
|
||||||
|
|
||||||
|
#define dyn_load_symbol(mod_name, symbol) dyn_load_symbol_ns(mod_name, ,symbol)
|
||||||
|
|
||||||
|
#endif
|
32
plugins/windows-notification/api/src/dyn_mod.cpp
Normal file
32
plugins/windows-notification/api/src/dyn_mod.cpp
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
|
||||||
|
#include "dyn_mod.hpp"
|
||||||
|
#include "win32.hpp"
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
namespace dyn_mod
|
||||||
|
{
|
||||||
|
auto load_module(const wchar_t *const path, const char *const dbgnym)
|
||||||
|
{
|
||||||
|
const auto mod = ::LoadLibraryW(path);
|
||||||
|
if (mod)
|
||||||
|
return mod;
|
||||||
|
const win32_error e{};
|
||||||
|
g_warning("failed to load %s", dbgnym);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
punny_func &load_symbol(
|
||||||
|
const wchar_t *const mod_path, const char *const mod_dbgnym,
|
||||||
|
const char *const symbol)
|
||||||
|
{
|
||||||
|
const auto p = reinterpret_cast<punny_func *>(
|
||||||
|
::GetProcAddress(load_module(mod_path, mod_dbgnym), symbol));
|
||||||
|
if (p)
|
||||||
|
return *p;
|
||||||
|
const win32_error e{};
|
||||||
|
g_warning("couldn't find %s in %s", symbol, mod_dbgnym);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,7 @@
|
||||||
#include "win32.hpp"
|
#include "win32.hpp"
|
||||||
#include "converter.hpp"
|
#include "converter.hpp"
|
||||||
#include "ginvoke.hpp"
|
#include "ginvoke.hpp"
|
||||||
|
#include "dyn_mod.hpp"
|
||||||
|
|
||||||
#include <objbase.h> // COM stuff
|
#include <objbase.h> // COM stuff
|
||||||
#include <shlobj.h> // IShellLink
|
#include <shlobj.h> // IShellLink
|
||||||
|
@ -15,33 +16,6 @@
|
||||||
|
|
||||||
namespace dyn
|
namespace dyn
|
||||||
{
|
{
|
||||||
inline auto load_module(const wchar_t *const path, const char *const dbgnym)
|
|
||||||
{
|
|
||||||
const auto mod = ::LoadLibraryW(path);
|
|
||||||
if (mod)
|
|
||||||
return mod;
|
|
||||||
const win32_error e{};
|
|
||||||
g_warning("failed to load %s", dbgnym);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
inline T &load_symbol(
|
|
||||||
const wchar_t *const mod_path, const char *const mod_dbgnym,
|
|
||||||
const char *const symbol)
|
|
||||||
{
|
|
||||||
const auto p = reinterpret_cast<T *>(
|
|
||||||
::GetProcAddress(load_module(mod_path, mod_dbgnym), symbol));
|
|
||||||
if (p)
|
|
||||||
return *p;
|
|
||||||
const win32_error e{};
|
|
||||||
g_warning("couldn't find %s in %s", symbol, mod_dbgnym);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define dyn_load_symbol(mod_name, symbol) \
|
|
||||||
::dyn::load_symbol<decltype(::symbol)>(L ## mod_name, mod_name, #symbol)
|
|
||||||
|
|
||||||
// PropVariantToString is a pain to use, and
|
// PropVariantToString is a pain to use, and
|
||||||
// MinGW 6.0.0 doesn't have libpropsys.a in the first place;
|
// MinGW 6.0.0 doesn't have libpropsys.a in the first place;
|
||||||
// MinGW 9.0.0 doesn't have PropVariantToStringAlloc in its libpropsys.a.
|
// MinGW 9.0.0 doesn't have PropVariantToStringAlloc in its libpropsys.a.
|
||||||
|
|
Loading…
Reference in a new issue