Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

380 lines
25 KiB

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1998
//
// File: DynLoad.hxx
//
// Contents: Macro for Dynamically loading/unloading entry points
//
// History: 25-Jun-98 KyleP Created
//
//---------------------------------------------------------------------------
#pragma once
//
// Sample use:
//
// DeclDynLoad( Kernel32,
// GetLongPathName,
// DWORD,
// WINAPI,
// (LPCWSTR lpszShortPath, LPWSTR lpszLongPath, DWORD cchBuffer) );
//
#define DeclDynLoad( DLL, Name, ReturnType, CallingConvention, Args, ArgsSansTypes ) \
\
typedef ReturnType (CallingConvention * PFN##Name)##Args; \
\
class CDynLoad##DLL \
{ \
public: \
CDynLoad##DLL() \
{ \
_hmod = LoadLibraryA( #DLL ".dll" ); \
\
if ( 0 == _hmod ) \
THROW( CException() ); \
\
_pfn = (PFN##Name)GetProcAddress( _hmod, #Name ); \
\
if ( 0 == _pfn ) \
{ \
FreeLibrary( _hmod ); \
THROW( CException() ); \
} \
} \
\
~CDynLoad##DLL() \
{ \
FreeLibrary( _hmod ); \
} \
\
ReturnType Name##Args \
{ \
return _pfn##ArgsSansTypes; \
} \
\
private: \
HMODULE _hmod; \
PFN##Name _pfn; \
}
#define DeclDynLoad2( DLL, Name, ReturnType, CallingConvention, Args, ArgsSansTypes, \
Name2, ReturnType2, CallingConvention2, Args2, ArgsSansTypes2 ) \
\
typedef ReturnType (CallingConvention * PFN##Name)##Args; \
typedef ReturnType2 (CallingConvention2 * PFN##Name2)##Args2; \
\
class CDynLoad##DLL \
{ \
public: \
CDynLoad##DLL() \
{ \
_hmod = LoadLibraryA( #DLL ".dll" ); \
\
if ( 0 == _hmod ) \
THROW( CException() ); \
\
_pfn = (PFN##Name)GetProcAddress( _hmod, #Name ); \
\
if ( 0 == _pfn ) \
{ \
FreeLibrary( _hmod ); \
THROW( CException() ); \
} \
\
_pfn2 = (PFN##Name2)GetProcAddress( _hmod, #Name2 ); \
\
if ( 0 == _pfn2 ) \
{ \
FreeLibrary( _hmod ); \
THROW( CException() ); \
} \
} \
\
~CDynLoad##DLL() \
{ \
FreeLibrary( _hmod ); \
} \
\
ReturnType Name##Args \
{ \
return _pfn##ArgsSansTypes; \
} \
\
ReturnType2 Name2##Args2 \
{ \
return _pfn2##ArgsSansTypes2; \
} \
\
private: \
HMODULE _hmod; \
PFN##Name _pfn; \
PFN##Name2 _pfn2; \
}
#define DeclDynLoad3( DLL, Name, ReturnType, CallingConvention, Args, ArgsSansTypes, \
Name2, ReturnType2, CallingConvention2, Args2, ArgsSansTypes2, \
Name3, ReturnType3, CallingConvention3, Args3, ArgsSansTypes3 ) \
\
typedef ReturnType (CallingConvention * PFN##Name)##Args; \
typedef ReturnType2 (CallingConvention2 * PFN##Name2)##Args2; \
typedef ReturnType3 (CallingConvention3 * PFN##Name3)##Args3; \
\
class CDynLoad##DLL \
{ \
public: \
CDynLoad##DLL() \
{ \
_hmod = LoadLibraryA( #DLL ".dll" ); \
\
if ( 0 == _hmod ) \
THROW( CException() ); \
\
_pfn = (PFN##Name)GetProcAddress( _hmod, #Name ); \
\
if ( 0 == _pfn ) \
{ \
FreeLibrary( _hmod ); \
THROW( CException() ); \
} \
\
_pfn2 = (PFN##Name2)GetProcAddress( _hmod, #Name2 ); \
\
if ( 0 == _pfn2 ) \
{ \
FreeLibrary( _hmod ); \
THROW( CException() ); \
} \
\
_pfn3 = (PFN##Name3)GetProcAddress( _hmod, #Name3 ); \
\
if ( 0 == _pfn3 ) \
{ \
FreeLibrary( _hmod ); \
THROW( CException() ); \
} \
} \
\
~CDynLoad##DLL() \
{ \
FreeLibrary( _hmod ); \
} \
\
ReturnType Name##Args \
{ \
return _pfn##ArgsSansTypes; \
} \
\
ReturnType2 Name2##Args2 \
{ \
return _pfn2##ArgsSansTypes2; \
} \
\
ReturnType3 Name3##Args3 \
{ \
return _pfn3##ArgsSansTypes3; \
} \
\
private: \
HMODULE _hmod; \
PFN##Name _pfn; \
PFN##Name2 _pfn2; \
PFN##Name3 _pfn3; \
}
#define DeclDynLoad4( DLL, Name, ReturnType, CallingConvention, Args, ArgsSansTypes, \
Name2, ReturnType2, CallingConvention2, Args2, ArgsSansTypes2, \
Name3, ReturnType3, CallingConvention3, Args3, ArgsSansTypes3, \
Name4, ReturnType4, CallingConvention4, Args4, ArgsSansTypes4 ) \
\
typedef ReturnType (CallingConvention * PFN##Name)##Args; \
typedef ReturnType2 (CallingConvention2 * PFN##Name2)##Args2; \
typedef ReturnType3 (CallingConvention3 * PFN##Name3)##Args3; \
typedef ReturnType4 (CallingConvention4 * PFN##Name4)##Args4; \
\
class CDynLoad##DLL \
{ \
public: \
CDynLoad##DLL() \
{ \
_hmod = LoadLibraryA( #DLL ".dll" ); \
\
if ( 0 == _hmod ) \
THROW( CException() ); \
\
_pfn = (PFN##Name)GetProcAddress( _hmod, #Name ); \
\
if ( 0 == _pfn ) \
{ \
FreeLibrary( _hmod ); \
THROW( CException() ); \
} \
\
_pfn2 = (PFN##Name2)GetProcAddress( _hmod, #Name2 ); \
\
if ( 0 == _pfn2 ) \
{ \
FreeLibrary( _hmod ); \
THROW( CException() ); \
} \
\
_pfn3 = (PFN##Name3)GetProcAddress( _hmod, #Name3 ); \
\
if ( 0 == _pfn3 ) \
{ \
FreeLibrary( _hmod ); \
THROW( CException() ); \
} \
\
_pfn4 = (PFN##Name4)GetProcAddress( _hmod, #Name4 ); \
\
if ( 0 == _pfn4 ) \
{ \
FreeLibrary( _hmod ); \
THROW( CException() ); \
} \
} \
\
~CDynLoad##DLL() \
{ \
FreeLibrary( _hmod ); \
} \
\
ReturnType Name##Args \
{ \
return _pfn##ArgsSansTypes; \
} \
\
ReturnType2 Name2##Args2 \
{ \
return _pfn2##ArgsSansTypes2; \
} \
\
ReturnType3 Name3##Args3 \
{ \
return _pfn3##ArgsSansTypes3; \
} \
\
ReturnType4 Name4##Args4 \
{ \
return _pfn4##ArgsSansTypes4; \
} \
\
private: \
HMODULE _hmod; \
PFN##Name _pfn; \
PFN##Name2 _pfn2; \
PFN##Name3 _pfn3; \
PFN##Name4 _pfn4; \
}
#define DeclDynLoad5( DLL, Name, ReturnType, CallingConvention, Args, ArgsSansTypes, \
Name2, ReturnType2, CallingConvention2, Args2, ArgsSansTypes2, \
Name3, ReturnType3, CallingConvention3, Args3, ArgsSansTypes3, \
Name4, ReturnType4, CallingConvention4, Args4, ArgsSansTypes4, \
Name5, ReturnType5, CallingConvention5, Args5, ArgsSansTypes5 ) \
\
typedef ReturnType (CallingConvention * PFN##Name)##Args; \
typedef ReturnType2 (CallingConvention2 * PFN##Name2)##Args2; \
typedef ReturnType3 (CallingConvention3 * PFN##Name3)##Args3; \
typedef ReturnType4 (CallingConvention4 * PFN##Name4)##Args4; \
typedef ReturnType5 (CallingConvention5 * PFN##Name5)##Args5; \
\
class CDynLoad##DLL \
{ \
public: \
CDynLoad##DLL() \
{ \
_hmod = LoadLibraryA( #DLL ".dll" ); \
\
if ( 0 == _hmod ) \
THROW( CException() ); \
\
_pfn = (PFN##Name)GetProcAddress( _hmod, #Name ); \
\
if ( 0 == _pfn ) \
{ \
FreeLibrary( _hmod ); \
THROW( CException() ); \
} \
\
_pfn2 = (PFN##Name2)GetProcAddress( _hmod, #Name2 ); \
\
if ( 0 == _pfn2 ) \
{ \
FreeLibrary( _hmod ); \
THROW( CException() ); \
} \
\
_pfn3 = (PFN##Name3)GetProcAddress( _hmod, #Name3 ); \
\
if ( 0 == _pfn3 ) \
{ \
FreeLibrary( _hmod ); \
THROW( CException() ); \
} \
\
_pfn4 = (PFN##Name4)GetProcAddress( _hmod, #Name4 ); \
\
if ( 0 == _pfn4 ) \
{ \
FreeLibrary( _hmod ); \
THROW( CException() ); \
} \
\
_pfn5 = (PFN##Name5)GetProcAddress( _hmod, #Name5 ); \
\
if ( 0 == _pfn5 ) \
{ \
FreeLibrary( _hmod ); \
THROW( CException() ); \
} \
} \
\
~CDynLoad##DLL() \
{ \
FreeLibrary( _hmod ); \
} \
\
ReturnType Name##Args \
{ \
return _pfn##ArgsSansTypes; \
} \
\
ReturnType2 Name2##Args2 \
{ \
return _pfn2##ArgsSansTypes2; \
} \
\
ReturnType3 Name3##Args3 \
{ \
return _pfn3##ArgsSansTypes3; \
} \
\
ReturnType4 Name4##Args4 \
{ \
return _pfn4##ArgsSansTypes4; \
} \
\
ReturnType5 Name5##Args5 \
{ \
return _pfn5##ArgsSansTypes5; \
} \
\
private: \
HMODULE _hmod; \
PFN##Name _pfn; \
PFN##Name2 _pfn2; \
PFN##Name3 _pfn3; \
PFN##Name4 _pfn4; \
PFN##Name5 _pfn5; \
}