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 == NULL) 21 return true; 22 if (!::FreeLibrary(_module)) 23 return false; 24 _module = NULL; 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 Z7_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 // _WIN32 114 115#include <dlfcn.h> 116#include <stdlib.h> 117#include "../Common/Common.h" 118 119// FARPROC 120void *GetProcAddress(HMODULE module, LPCSTR procName) 121{ 122 void *ptr = NULL; 123 if (module) 124 ptr = dlsym(module, procName); 125 return ptr; 126} 127 128namespace NWindows { 129namespace NDLL { 130 131bool CLibrary::Free() throw() 132{ 133 if (!_module) 134 return true; 135 const int ret = dlclose(_module); 136 if (ret != 0) 137 return false; 138 _module = NULL; 139 return true; 140} 141 142bool CLibrary::Load(CFSTR path) throw() 143{ 144 if (!Free()) 145 return false; 146 147 int options = 0; 148 149 #ifdef RTLD_LOCAL 150 options |= RTLD_LOCAL; 151 #endif 152 153 #ifdef RTLD_NOW 154 options |= RTLD_NOW; 155 #endif 156 157 #ifdef RTLD_GROUP 158 #if ! (defined(hpux) || defined(__hpux)) 159 options |= RTLD_GROUP; // mainly for solaris but not for HPUX 160 #endif 161 #endif 162 163 _module = dlopen(path, options); 164 return (_module != NULL); 165} 166 167/* 168// FARPROC 169void * CLibrary::GetProc(LPCSTR procName) const 170{ 171 // return My_GetProcAddress(_module, procName); 172 return local_GetProcAddress(_module, procName); 173 // return NULL; 174} 175*/ 176 177}} 178 179#endif 180