177 lines
3.5 KiB
C++
177 lines
3.5 KiB
C++
//+----------------------------------------------------------------------------
|
|
//
|
|
// File: dynamiclib.h
|
|
//
|
|
// Module: Various Connection Manager modules (CMDIAL32.DLL, CMMON32.EXE, etc)
|
|
//
|
|
// Synopsis: Definition of CDynamicLibrary, a utility class that helps with
|
|
// the dynamic loading of a library and the getting of proc
|
|
// addresses from that library.
|
|
//
|
|
// Copyright (c) 1998-1999 Microsoft Corporation
|
|
//
|
|
// Author: fengsun Created 02/17/98
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
|
|
#ifndef DYNAMICLIB_H
|
|
#define DYNAMICLIB_H
|
|
|
|
//
|
|
// Define A_W as A for ansi and W for unicode
|
|
//
|
|
#ifdef UNICODE
|
|
#define A_W "W"
|
|
#else
|
|
#define A_W "A"
|
|
#endif // UNICODE
|
|
|
|
//
|
|
// Define LoadLibraryExU since not everyone is using the UAPI's yet
|
|
//
|
|
#ifndef _CMUTOA
|
|
|
|
#ifdef UNICODE
|
|
#define LoadLibraryExU LoadLibraryExW
|
|
#else
|
|
#define LoadLibraryExU LoadLibraryExA
|
|
#endif // UNICODE
|
|
|
|
#endif // _CMUTOA
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// class : CDynamicLibrary
|
|
//
|
|
// Synopsis: A class that will unload the library on destructor
|
|
//
|
|
// History: fengsun created 2/17/97
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CDynamicLibrary
|
|
{
|
|
public:
|
|
CDynamicLibrary();
|
|
CDynamicLibrary(const TCHAR* lpLibraryName);
|
|
~CDynamicLibrary();
|
|
|
|
BOOL Load(const TCHAR* lpLibraryName);
|
|
void Unload();
|
|
|
|
BOOL IsLoaded() const;
|
|
BOOL EnsureLoaded(const TCHAR* lpLibraryName);
|
|
HINSTANCE GetInstance() const;
|
|
|
|
FARPROC GetProcAddress(const char* lpProcName) const;
|
|
|
|
protected:
|
|
HINSTANCE m_hInst; // The instance handle returned by LoadLibrary
|
|
};
|
|
|
|
//
|
|
// Constructor
|
|
//
|
|
inline CDynamicLibrary::CDynamicLibrary() :m_hInst(NULL) {}
|
|
|
|
//
|
|
// Constructor that calls LoadLibrary
|
|
//
|
|
inline CDynamicLibrary::CDynamicLibrary(const TCHAR* lpLibraryName)
|
|
{
|
|
m_hInst = NULL;
|
|
Load(lpLibraryName);
|
|
}
|
|
|
|
|
|
//
|
|
// Destructor that automatic FreeLibrary
|
|
//
|
|
inline CDynamicLibrary::~CDynamicLibrary()
|
|
{
|
|
Unload();
|
|
}
|
|
|
|
//
|
|
// Call LoadLibrary
|
|
//
|
|
inline BOOL CDynamicLibrary::Load(const TCHAR* lpLibraryName)
|
|
{
|
|
MYDBGASSERT(m_hInst == NULL);
|
|
MYDBGASSERT(lpLibraryName);
|
|
|
|
CMTRACE1(TEXT("CDynamicLibrary - Loading library - %s"), lpLibraryName);
|
|
|
|
m_hInst = LoadLibraryExU(lpLibraryName, NULL, 0);
|
|
|
|
#ifdef DEBUG
|
|
if (!m_hInst)
|
|
{
|
|
CMTRACE1(TEXT("CDynamicLibrary - LoadLibrary failed - GetLastError() = %u"), GetLastError());
|
|
}
|
|
#endif
|
|
|
|
return m_hInst != NULL;
|
|
}
|
|
|
|
//
|
|
// Call FreeLibrary
|
|
//
|
|
inline void CDynamicLibrary::Unload()
|
|
{
|
|
if (m_hInst)
|
|
{
|
|
FreeLibrary(m_hInst);
|
|
m_hInst = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Whether the library is successfully loaded
|
|
//
|
|
inline BOOL CDynamicLibrary::IsLoaded() const
|
|
{
|
|
return m_hInst != NULL;
|
|
}
|
|
|
|
//
|
|
// Retrieve the instance handle
|
|
//
|
|
inline HINSTANCE CDynamicLibrary::GetInstance() const
|
|
{
|
|
return m_hInst;
|
|
}
|
|
|
|
//
|
|
// call ::GetProcAddress on m_hInst
|
|
//
|
|
inline FARPROC CDynamicLibrary::GetProcAddress(const char* lpProcName) const
|
|
{
|
|
MYDBGASSERT(m_hInst);
|
|
|
|
if (m_hInst)
|
|
{
|
|
return ::GetProcAddress(m_hInst, lpProcName);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//
|
|
// Load the library, if not loaded yet,
|
|
// Note, we do not check the consistence of lpLibraryName. Use caution with this function
|
|
//
|
|
inline BOOL CDynamicLibrary::EnsureLoaded(const TCHAR* lpLibraryName)
|
|
{
|
|
MYDBGASSERT(lpLibraryName);
|
|
if (m_hInst == NULL)
|
|
{
|
|
m_hInst = LoadLibraryEx(lpLibraryName, NULL, 0);
|
|
}
|
|
|
|
return m_hInst != NULL;
|
|
}
|
|
|
|
#endif
|