1// Windows/DLL.cpp
2
3#include "StdAfx.h"
4
5#ifndef _UNICODE
6#include "../Common/StringConvert.h"
7#endif
8
9#include "DLL.h"
10
11#ifndef _UNICODE
12extern bool g_IsNT;
13#endif
14
15namespace NWindows {
16namespace NDLL {
17
18bool CLibrary::Free()
19{
20  if (_module == 0)
21    return true;
22  // MessageBox(0, TEXT(""), TEXT("Free"), 0);
23  // Sleep(5000);
24  if (!::FreeLibrary(_module))
25    return false;
26  _module = 0;
27  return true;
28}
29
30bool CLibrary::LoadOperations(HMODULE newModule)
31{
32  if (newModule == NULL)
33    return false;
34  if (!Free())
35    return false;
36  _module = newModule;
37  return true;
38}
39
40bool CLibrary::LoadEx(LPCTSTR fileName, DWORD flags)
41{
42  // MessageBox(0, fileName, TEXT("LoadEx"), 0);
43  return LoadOperations(::LoadLibraryEx(fileName, NULL, flags));
44}
45
46bool CLibrary::Load(LPCTSTR fileName)
47{
48  // MessageBox(0, fileName, TEXT("Load"), 0);
49  // Sleep(5000);
50  // OutputDebugString(fileName);
51  // OutputDebugString(TEXT("\n"));
52  return LoadOperations(::LoadLibrary(fileName));
53}
54
55#ifndef _UNICODE
56static inline UINT GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; }
57CSysString GetSysPath(LPCWSTR sysPath)
58  { return UnicodeStringToMultiByte(sysPath, GetCurrentCodePage()); }
59
60bool CLibrary::LoadEx(LPCWSTR fileName, DWORD flags)
61{
62  if (g_IsNT)
63    return LoadOperations(::LoadLibraryExW(fileName, NULL, flags));
64  return LoadEx(GetSysPath(fileName), flags);
65}
66bool CLibrary::Load(LPCWSTR fileName)
67{
68  if (g_IsNT)
69    return LoadOperations(::LoadLibraryW(fileName));
70  return Load(GetSysPath(fileName));
71}
72#endif
73
74bool MyGetModuleFileName(HMODULE hModule, CSysString &result)
75{
76  result.Empty();
77  TCHAR fullPath[MAX_PATH + 2];
78  DWORD size = ::GetModuleFileName(hModule, fullPath, MAX_PATH + 1);
79  if (size <= MAX_PATH && size != 0)
80  {
81    result = fullPath;
82    return true;
83  }
84  return false;
85}
86
87#ifndef _UNICODE
88bool MyGetModuleFileName(HMODULE hModule, UString &result)
89{
90  result.Empty();
91  if (g_IsNT)
92  {
93    wchar_t fullPath[MAX_PATH + 2];
94    DWORD size = ::GetModuleFileNameW(hModule, fullPath, MAX_PATH + 1);
95    if (size <= MAX_PATH && size != 0)
96    {
97      result = fullPath;
98      return true;
99    }
100    return false;
101  }
102  CSysString resultSys;
103  if (!MyGetModuleFileName(hModule, resultSys))
104    return false;
105  result = MultiByteToUnicodeString(resultSys, GetCurrentCodePage());
106  return true;
107}
108#endif
109
110}}
111