mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-09 02:07:06 -06:00
114 lines
2.5 KiB
C++
Executable File
114 lines
2.5 KiB
C++
Executable File
// Windows/DLL.cpp
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "DLL.h"
|
|
#include "Defs.h"
|
|
#ifndef _UNICODE
|
|
#include "../Common/StringConvert.h"
|
|
#endif
|
|
|
|
namespace NWindows {
|
|
namespace NDLL {
|
|
|
|
CLibrary::~CLibrary()
|
|
{
|
|
Free();
|
|
}
|
|
|
|
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; }
|
|
bool CLibrary::LoadEx(LPCWSTR fileName, DWORD flags)
|
|
{
|
|
HMODULE module = ::LoadLibraryExW(fileName, NULL, flags);
|
|
if (module != 0)
|
|
return LoadOperations(module);
|
|
if (::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
|
|
return false;
|
|
return LoadEx(UnicodeStringToMultiByte(fileName, GetCurrentCodePage()), flags);
|
|
}
|
|
bool CLibrary::Load(LPCWSTR fileName)
|
|
{
|
|
HMODULE module = ::LoadLibraryW(fileName);
|
|
if (module != 0)
|
|
return LoadOperations(module);
|
|
if (::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
|
|
return false;
|
|
return Load(UnicodeStringToMultiByte(fileName, GetCurrentCodePage()));
|
|
}
|
|
#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();
|
|
wchar_t fullPath[MAX_PATH + 2];
|
|
DWORD size = ::GetModuleFileNameW(hModule, fullPath, MAX_PATH + 1);
|
|
if (size <= MAX_PATH && size != 0)
|
|
{
|
|
result = fullPath;
|
|
return true;
|
|
}
|
|
if (::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
|
|
return false;
|
|
CSysString resultSys;
|
|
if (!MyGetModuleFileName(hModule, resultSys))
|
|
return false;
|
|
result = MultiByteToUnicodeString(resultSys, GetCurrentCodePage());
|
|
return true;
|
|
}
|
|
#endif
|
|
|
|
}}
|