// Windows/DLL.cpp | |
#include "StdAfx.h" | |
#ifndef _UNICODE | |
#include "../Common/StringConvert.h" | |
#endif | |
#include "DLL.h" | |
#ifndef _UNICODE | |
extern bool g_IsNT; | |
#endif | |
namespace NWindows { | |
namespace NDLL { | |
bool CLibrary::Free() | |
{ | |
if (_module == 0) | |
return true; | |
// MessageBox(0, TEXT(""), TEXT("Free"), 0); | |
// Sleep(5000); | |
if (!::FreeLibrary(_module)) | |
return false; | |
_module = 0; | |
return true; | |
} | |
bool CLibrary::LoadOperations(HMODULE newModule) | |
{ | |
if (newModule == NULL) | |
return false; | |
if (!Free()) | |
return false; | |
_module = newModule; | |
return true; | |
} | |
bool CLibrary::LoadEx(LPCTSTR fileName, DWORD flags) | |
{ | |
// MessageBox(0, fileName, TEXT("LoadEx"), 0); | |
return LoadOperations(::LoadLibraryEx(fileName, NULL, flags)); | |
} | |
bool CLibrary::Load(LPCTSTR fileName) | |
{ | |
// MessageBox(0, fileName, TEXT("Load"), 0); | |
// Sleep(5000); | |
// OutputDebugString(fileName); | |
// OutputDebugString(TEXT("\n")); | |
return LoadOperations(::LoadLibrary(fileName)); | |
} | |
#ifndef _UNICODE | |
static inline UINT GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; } | |
CSysString GetSysPath(LPCWSTR sysPath) | |
{ return UnicodeStringToMultiByte(sysPath, GetCurrentCodePage()); } | |
bool CLibrary::LoadEx(LPCWSTR fileName, DWORD flags) | |
{ | |
if (g_IsNT) | |
return LoadOperations(::LoadLibraryExW(fileName, NULL, flags)); | |
return LoadEx(GetSysPath(fileName), flags); | |
} | |
bool CLibrary::Load(LPCWSTR fileName) | |
{ | |
if (g_IsNT) | |
return LoadOperations(::LoadLibraryW(fileName)); | |
return Load(GetSysPath(fileName)); | |
} | |
#endif | |
bool MyGetModuleFileName(HMODULE hModule, CSysString &result) | |
{ | |
result.Empty(); | |
TCHAR fullPath[MAX_PATH + 2]; | |
DWORD size = ::GetModuleFileName(hModule, fullPath, MAX_PATH + 1); | |
if (size <= MAX_PATH && size != 0) | |
{ | |
result = fullPath; | |
return true; | |
} | |
return false; | |
} | |
#ifndef _UNICODE | |
bool MyGetModuleFileName(HMODULE hModule, UString &result) | |
{ | |
result.Empty(); | |
if (g_IsNT) | |
{ | |
wchar_t fullPath[MAX_PATH + 2]; | |
DWORD size = ::GetModuleFileNameW(hModule, fullPath, MAX_PATH + 1); | |
if (size <= MAX_PATH && size != 0) | |
{ | |
result = fullPath; | |
return true; | |
} | |
return false; | |
} | |
CSysString resultSys; | |
if (!MyGetModuleFileName(hModule, resultSys)) | |
return false; | |
result = MultiByteToUnicodeString(resultSys, GetCurrentCodePage()); | |
return true; | |
} | |
#endif | |
}} |