4#include "Stroika/Foundation/StroikaPreComp.h"
10#if qStroika_Foundation_Common_Platform_Windows
11#include "Platform/Windows/Exception.h"
14#include "DLLSupport.h"
30#if qStroika_Foundation_Common_Platform_POSIX
32 DLLHandle LoadDLL_ (
const SDKChar* dllName,
int flags)
34#if qTargetPlatformSDKUseswchar_t
35 return ::dlopen (Characters::SDK2Narrow (dllName).c_str (), flags);
37 return ::dlopen (dllName, flags);
41#if qStroika_Foundation_Common_Platform_Windows
43 DLLHandle LoadDLL_ (
const SDKChar* dllName)
45 return ::LoadLibrary (dllName);
52#if qStroika_Foundation_Common_Platform_POSIX
54 const char* err = dlerror ();
55 if (err !=
nullptr) [[unlikely]] {
59 Execution::ThrowSystemErrNo ();
65#if USE_NOISY_TRACE_IN_THIS_MODULE_
66 DbgTrace (SDKSTR (
"DLLLoader - loading DLL %s"), dllName);
69#if qStroika_Foundation_Common_Platform_POSIX
70 fModule_ = LoadDLL_ (dllName, RTLD_NOW);
71#elif qStroika_Foundation_Common_Platform_Windows
72 fModule_ = LoadDLL_ (dllName);
74 if (fModule_ ==
nullptr) {
81#if USE_NOISY_TRACE_IN_THIS_MODULE_
82 DbgTrace (SDKSTR (
"DLLLoader - loading DLL %s (with searchPath)"), dllName);
85#if qStroika_Foundation_Common_Platform_POSIX
86 fModule_ = LoadDLL_ (dllName, RTLD_NOW);
88 fModule_ = LoadDLL_ (dllName);
90 if (fModule_ ==
nullptr) {
91 for (
auto i = searchPath.begin (); i != searchPath.end (); ++i) {
92 filesystem::path modulePath = *i / dllName;
93#if qStroika_Foundation_Common_Platform_POSIX
94 fModule_ = LoadDLL_ (modulePath.c_str (), RTLD_NOW);
96 fModule_ = LoadDLL_ (modulePath.c_str ());
98 if (fModule_ !=
nullptr) {
103 if (fModule_ ==
nullptr) {
108#if qStroika_Foundation_Common_Platform_POSIX
111#if USE_NOISY_TRACE_IN_THIS_MODULE_
112 DbgTrace (SDKSTR (
"DLLLoader - loading DLL %s, flags=0x%x"), dllName, flags);
115 fModule_ = LoadDLL_ (dllName, RTLD_NOW);
116 if (fModule_ ==
nullptr) {
121DLLLoader::DLLLoader (
const SDKChar* dllName,
const vector<filesystem::path>& searchPath,
int flags)
123#if USE_NOISY_TRACE_IN_THIS_MODULE_
124 DbgTrace (SDKSTR (
"DLLLoader/3 - loading DLL %s, flags=0x%x"), dllName, flags);
126#if qStroika_Foundation_Common_Platform_POSIX
127 fModule_ = LoadDLL_ (dllName, flags);
129 fModule_ = LoadDLL_ (dllName);
131 if (fModule_ ==
nullptr) {
132 for (
auto i = searchPath.begin (); i != searchPath.end (); ++i) {
133 filesystem::path modulePath = *i / dllName;
134#if qStroika_Foundation_Common_Platform_POSIX
135 fModule_ = LoadDLL_ (modulePath.c_str (), flags);
137 fModule_ = LoadDLL_ (modulePath.c_str ());
139 if (fModule_ !=
nullptr) {
144 if (fModule_ ==
nullptr) {
150DLLLoader::~DLLLoader ()
152#if USE_NOISY_TRACE_IN_THIS_MODULE_
153 DbgTrace (
"DLLLoader - unloading dll 0x%p", fModule_);
156#if qStroika_Foundation_Common_Platform_Windows
157 ::FreeLibrary (fModule_);
159 if (::dlclose (fModule_) != 0) {
160 const char* err = ::dlerror ();
161 if (err !=
nullptr) [[unlikely]] {
#define RequireNotNull(p)
DLLLoader(const SDKChar *dllName)
void Throw(T &&e2Throw)
identical to builtin C++ 'throw' except that it does helpful, type dependent DbgTrace() messages firs...