//+-------------------------------------------------------------------------- // // 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; \ }