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.
|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995 - 1996.
//
// File: dynload.cxx
//
// Contents: Wrappers for functions exported by DLLs that are loaded only
// when needed.
//
// Classes:
//
// Functions: FreeDynLoadLibs
//
// History: 07-Oct-96 AnirudhS Created.
//
//--------------------------------------------------------------------------
#include "..\pch\headers.hxx"
#pragma hdrstop
#include <debug.hxx>
#include "dynload.hxx"
//
// These typedefs must match the function prototypes in objbase.h
//
typedef LPVOID (STDAPICALLTYPE *PF_CoTaskMemAlloc) (ULONG cb); typedef LPVOID (STDAPICALLTYPE *PF_CoTaskMemRealloc) (LPVOID pv, ULONG cb); typedef void (STDAPICALLTYPE *PF_CoTaskMemFree) (LPVOID pv);
//
// Local functions
//
void LoadOleFunction( FARPROC * pfCurrentValue, LPCSTR pszFunctionName );
//
// Static data
//
HMODULE hOle32Dll;
//+----------------------------------------------------------------------------
//
// Function: GetProcAddressInModule
//
// Synopsis: Gets the address of the specified function exported by the
// specified module.
//
// Arguments: [pszFunction] - Name of the function desired.
// [ptszModule] - Name of the module. This must already be loaded.
//
//-----------------------------------------------------------------------------
FARPROC GetProcAddressInModule( LPCSTR pszFunction, LPCTSTR ptszModule ) { HMODULE hMod = GetModuleHandle(ptszModule); schAssert(hMod != NULL); return (GetProcAddress(hMod, pszFunction)); }
//+----------------------------------------------------------------------------
//
// Function: LoadOleFunction
//
// Synopsis: Loads OLE32.DLL if it hasn't been loaded, and gets the address
// of the specified function exported by it.
//
// Arguments: [pfCurrentValue] - Address where the function pointer will be
// returned. If this is not NULL on entry it is assumed to
// already point to the function.
// [pszFunctionName] - Name of the function desired.
//
//-----------------------------------------------------------------------------
void LoadOleFunction( FARPROC * pfCurrentValue, LPCSTR pszFunctionName ) { if (*pfCurrentValue != NULL) { schAssert(hOle32Dll != NULL); return; }
if (hOle32Dll != NULL || (hOle32Dll = LoadLibrary(TEXT("OLE32.DLL"))) != NULL) { *pfCurrentValue = GetProcAddress(hOle32Dll, pszFunctionName); } }
//+----------------------------------------------------------------------------
//
// Function: FreeDynLoadLibs
//
// Synopsis: Unloads DLLs that have been dynamically loaded.
//
// Arguments: None.
//
// Notes: WARNING: This will make all the function pointers invalid.
// Therefore, this function should only be called if this
// module is being unloaded.
//
//-----------------------------------------------------------------------------
void FreeDynLoadLibs(void) { if (hOle32Dll != NULL) { FreeLibrary(hOle32Dll); #if DBG == 1
hOle32Dll = NULL; #endif
} }
//+----------------------------------------------------------------------------
//
// Function wrappers
//
//-----------------------------------------------------------------------------
LPVOID WrapCoTaskMemAlloc( ULONG cb ) { static PF_CoTaskMemAlloc pf_CoTaskMemAlloc;
LoadOleFunction((FARPROC *) &pf_CoTaskMemAlloc, "CoTaskMemAlloc");
if (pf_CoTaskMemAlloc != NULL) { return pf_CoTaskMemAlloc(cb); } else { return NULL; } }
LPVOID WrapCoTaskMemRealloc( LPVOID pv, ULONG cb ) { static PF_CoTaskMemRealloc pf_CoTaskMemRealloc;
LoadOleFunction((FARPROC *) &pf_CoTaskMemRealloc, "CoTaskMemRealloc");
if (pf_CoTaskMemRealloc != NULL) { return pf_CoTaskMemRealloc(pv, cb); } else { return NULL; } }
void WrapCoTaskMemFree( LPVOID pv ) { static PF_CoTaskMemFree pf_CoTaskMemFree;
LoadOleFunction((FARPROC *) &pf_CoTaskMemFree, "CoTaskMemFree");
if (pf_CoTaskMemFree != NULL) { pf_CoTaskMemFree(pv); } }
|