aboutsummaryrefslogtreecommitdiff
path: root/CPP/Windows/DLL.cpp
diff options
context:
space:
mode:
authorIgor Pavlov <87184205+ip7z@users.noreply.github.com>2021-12-27 00:00:00 +0000
committerIgor Pavlov <87184205+ip7z@users.noreply.github.com>2022-03-18 15:35:13 +0500
commitf19f813537c7aea1c20749c914e756b54a9c3cf5 (patch)
tree816ba62ca7c0fa19f2eb46d9e9d6f7dd7c3a744d /CPP/Windows/DLL.cpp
parent98e06a519b63b81986abe76d28887f6984a7732b (diff)
download7zip-21.07.tar.gz
7zip-21.07.tar.bz2
7zip-21.07.zip
'21.07'21.07
Diffstat (limited to 'CPP/Windows/DLL.cpp')
-rw-r--r--CPP/Windows/DLL.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/CPP/Windows/DLL.cpp b/CPP/Windows/DLL.cpp
new file mode 100644
index 0000000..cf5d01a
--- /dev/null
+++ b/CPP/Windows/DLL.cpp
@@ -0,0 +1,191 @@
1// Windows/DLL.cpp
2
3#include "StdAfx.h"
4
5#include "DLL.h"
6
7#ifdef _WIN32
8
9#ifndef _UNICODE
10extern bool g_IsNT;
11#endif
12
13extern HINSTANCE g_hInstance;
14
15namespace NWindows {
16namespace NDLL {
17
18bool CLibrary::Free() throw()
19{
20 if (_module == 0)
21 return true;
22 if (!::FreeLibrary(_module))
23 return false;
24 _module = 0;
25 return true;
26}
27
28bool CLibrary::LoadEx(CFSTR path, DWORD flags) throw()
29{
30 if (!Free())
31 return false;
32 #ifndef _UNICODE
33 if (!g_IsNT)
34 {
35 _module = ::LoadLibraryEx(fs2fas(path), NULL, flags);
36 }
37 else
38 #endif
39 {
40 _module = ::LoadLibraryExW(fs2us(path), NULL, flags);
41 }
42 return (_module != NULL);
43}
44
45bool CLibrary::Load(CFSTR path) throw()
46{
47 if (!Free())
48 return false;
49 #ifndef _UNICODE
50 if (!g_IsNT)
51 {
52 _module = ::LoadLibrary(fs2fas(path));
53 }
54 else
55 #endif
56 {
57 _module = ::LoadLibraryW(fs2us(path));
58 }
59 return (_module != NULL);
60}
61
62bool MyGetModuleFileName(FString &path)
63{
64 HMODULE hModule = g_hInstance;
65 path.Empty();
66 #ifndef _UNICODE
67 if (!g_IsNT)
68 {
69 TCHAR s[MAX_PATH + 2];
70 s[0] = 0;
71 DWORD size = ::GetModuleFileName(hModule, s, MAX_PATH + 1);
72 if (size <= MAX_PATH && size != 0)
73 {
74 path = fas2fs(s);
75 return true;
76 }
77 }
78 else
79 #endif
80 {
81 WCHAR s[MAX_PATH + 2];
82 s[0] = 0;
83 DWORD size = ::GetModuleFileNameW(hModule, s, MAX_PATH + 1);
84 if (size <= MAX_PATH && size != 0)
85 {
86 path = us2fs(s);
87 return true;
88 }
89 }
90 return false;
91}
92
93#ifndef _SFX
94
95FString GetModuleDirPrefix()
96{
97 FString s;
98 if (MyGetModuleFileName(s))
99 {
100 int pos = s.ReverseFind_PathSepar();
101 if (pos >= 0)
102 s.DeleteFrom((unsigned)(pos + 1));
103 }
104 if (s.IsEmpty())
105 s = "." STRING_PATH_SEPARATOR;
106 return s;
107}
108
109#endif
110
111}}
112
113#else
114
115#include <dlfcn.h>
116#include <stdlib.h>
117
118namespace NWindows {
119namespace NDLL {
120
121bool CLibrary::Free() throw()
122{
123 if (_module == NULL)
124 return true;
125 int ret = dlclose(_module);
126 if (ret != 0)
127 return false;
128 _module = NULL;
129 return true;
130}
131
132static
133// FARPROC
134void *
135local_GetProcAddress(HMODULE module, LPCSTR procName)
136{
137 void *ptr = NULL;
138 if (module)
139 {
140 ptr = dlsym(module, procName);
141 }
142 return ptr;
143}
144
145bool CLibrary::Load(CFSTR path) throw()
146{
147 if (!Free())
148 return false;
149
150 int options = 0;
151
152 #ifdef RTLD_LOCAL
153 options |= RTLD_LOCAL;
154 #endif
155
156 #ifdef RTLD_NOW
157 options |= RTLD_NOW;
158 #endif
159
160 #ifdef RTLD_GROUP
161 #if ! (defined(hpux) || defined(__hpux))
162 options |= RTLD_GROUP; // mainly for solaris but not for HPUX
163 #endif
164 #endif
165
166 void *handler = dlopen(path, options);
167
168 if (handler)
169 {
170 // here we can transfer some settings to DLL
171 }
172 else
173 {
174 }
175
176 _module = handler;
177
178 return (_module != NULL);
179}
180
181// FARPROC
182void * CLibrary::GetProc(LPCSTR procName) const
183{
184 // return My_GetProcAddress(_module, procName);
185 return local_GetProcAddress(_module, procName);
186 // return NULL;
187}
188
189}}
190
191#endif