diff options
author | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2021-12-27 00:00:00 +0000 |
---|---|---|
committer | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2022-03-18 15:35:13 +0500 |
commit | f19f813537c7aea1c20749c914e756b54a9c3cf5 (patch) | |
tree | 816ba62ca7c0fa19f2eb46d9e9d6f7dd7c3a744d /CPP/Windows/DLL.cpp | |
parent | 98e06a519b63b81986abe76d28887f6984a7732b (diff) | |
download | 7zip-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.cpp | 191 |
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 | ||
10 | extern bool g_IsNT; | ||
11 | #endif | ||
12 | |||
13 | extern HINSTANCE g_hInstance; | ||
14 | |||
15 | namespace NWindows { | ||
16 | namespace NDLL { | ||
17 | |||
18 | bool 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 | |||
28 | bool 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 | |||
45 | bool 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 | |||
62 | bool 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 | |||
95 | FString 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 | |||
118 | namespace NWindows { | ||
119 | namespace NDLL { | ||
120 | |||
121 | bool 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 | |||
132 | static | ||
133 | // FARPROC | ||
134 | void * | ||
135 | local_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 | |||
145 | bool 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 | ||
182 | void * 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 | ||