1 // Windows/DLL.cpp 2 3 #include "StdAfx.h" 4 5 #include "DLL.h" 6 7 #ifndef _UNICODE 8 extern bool g_IsNT; 9 #endif 10 11 extern HINSTANCE g_hInstance; 12 13 namespace NWindows { 14 namespace NDLL { 15 16 bool CLibrary::Free() throw() 17 { 18 if (_module == 0) 19 return true; 20 if (!::FreeLibrary(_module)) 21 return false; 22 _module = 0; 23 return true; 24 } 25 26 bool CLibrary::LoadEx(CFSTR path, DWORD flags) throw() 27 { 28 if (!Free()) 29 return false; 30 #ifndef _UNICODE 31 if (!g_IsNT) 32 { 33 _module = ::LoadLibraryEx(fs2fas(path), NULL, flags); 34 } 35 else 36 #endif 37 { 38 _module = ::LoadLibraryExW(fs2us(path), NULL, flags); 39 } 40 return (_module != NULL); 41 } 42 43 bool CLibrary::Load(CFSTR path) throw() 44 { 45 if (!Free()) 46 return false; 47 #ifndef _UNICODE 48 if (!g_IsNT) 49 { 50 _module = ::LoadLibrary(fs2fas(path)); 51 } 52 else 53 #endif 54 { 55 _module = ::LoadLibraryW(fs2us(path)); 56 } 57 return (_module != NULL); 58 } 59 60 bool MyGetModuleFileName(FString &path) 61 { 62 HMODULE hModule = g_hInstance; 63 path.Empty(); 64 #ifndef _UNICODE 65 if (!g_IsNT) 66 { 67 TCHAR s[MAX_PATH + 2]; 68 s[0] = 0; 69 DWORD size = ::GetModuleFileName(hModule, s, MAX_PATH + 1); 70 if (size <= MAX_PATH && size != 0) 71 { 72 path = fas2fs(s); 73 return true; 74 } 75 } 76 else 77 #endif 78 { 79 WCHAR s[MAX_PATH + 2]; 80 s[0] = 0; 81 DWORD size = ::GetModuleFileNameW(hModule, s, MAX_PATH + 1); 82 if (size <= MAX_PATH && size != 0) 83 { 84 path = us2fs(s); 85 return true; 86 } 87 } 88 return false; 89 } 90 91 #ifndef _SFX 92 93 FString GetModuleDirPrefix() 94 { 95 FString s; 96 if (MyGetModuleFileName(s)) 97 { 98 int pos = s.ReverseFind(FCHAR_PATH_SEPARATOR); 99 if (pos >= 0) 100 { 101 s.DeleteFrom(pos + 1); 102 return s; 103 } 104 } 105 return FTEXT(".") FSTRING_PATH_SEPARATOR; 106 } 107 108 #endif 109 110 }} 111