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 
Free()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 
LoadEx(CFSTR path,DWORD flags)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 
Load(CFSTR path)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 
MyGetModuleFileName(FString & path)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 
GetModuleDirPrefix()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