101 lines
3.3 KiB
C++
101 lines
3.3 KiB
C++
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// File: linkdll.cpp
|
||
|
//
|
||
|
// Module: Common Code
|
||
|
//
|
||
|
// Synopsis: Implementation of linkage functions LinkToDll and BindLinkage
|
||
|
//
|
||
|
// Copyright (c) 1999 Microsoft Corporation
|
||
|
//
|
||
|
// Author: quintinb created header 08/19/99
|
||
|
//
|
||
|
//+----------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: LinkToDll
|
||
|
//
|
||
|
// Synopsis: Helper function to manage the process of linking to a DLL and
|
||
|
// settings up a function table for later use.
|
||
|
//
|
||
|
// Arguments: HINSTANCE *phInst - A ptr to an hInst to be filled with the hInst of the DLL to be linked.
|
||
|
// LPCTSTR pszDll - Ptr to the name of the DLL to be linked.
|
||
|
// LPCSTR *ppszPfn - Ptr to a table of function names to be retrieved.
|
||
|
// void **ppvPfn - Ptr to table for storage of pointers to DLL functions used.
|
||
|
//
|
||
|
// Returns: BOOL - TRUE if fully loaded and linked.
|
||
|
//
|
||
|
// History: nickball Created Header 1/5/98
|
||
|
//
|
||
|
//+----------------------------------------------------------------------------
|
||
|
BOOL LinkToDll(HINSTANCE *phInst, LPCSTR pszDll, LPCSTR *ppszPfn, void **ppvPfn)
|
||
|
{
|
||
|
MYDBGASSERT(phInst);
|
||
|
MYDBGASSERT(pszDll);
|
||
|
MYDBGASSERT(ppszPfn);
|
||
|
MYDBGASSERT(ppvPfn);
|
||
|
|
||
|
CMTRACE1A("LinkToDll - Loading library - %s", pszDll);
|
||
|
|
||
|
*phInst = LoadLibraryExA(pszDll, NULL, 0);
|
||
|
|
||
|
if (!*phInst)
|
||
|
{
|
||
|
CMTRACE3A("LinkToDll[phInst=%p, *pszDll=%s, ppszPfn=%p,", phInst, MYDBGSTRA(pszDll), ppszPfn);
|
||
|
CMTRACE1A("\tppvPfn=%p] LoadLibrary() failed.", ppvPfn);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Link succeeded now setup function addresses
|
||
|
//
|
||
|
|
||
|
return BindLinkage(*phInst, ppszPfn, ppvPfn);
|
||
|
}
|
||
|
|
||
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: BindLinkage
|
||
|
//
|
||
|
// Synopsis: Helper function to fill in the given function pointer table with
|
||
|
// the addresses of the functions specified in the given string table.
|
||
|
// Function addresses are retrieved from the DLL specified by hInst.
|
||
|
//
|
||
|
// Arguments: HINSTANCE hInstDll - The hInst of the DLL.
|
||
|
// LPCSTR *ppszPfn - Ptr to a table of function names.
|
||
|
// void **ppvPfn - Ptr to a table of function pointers to be filled in.
|
||
|
//
|
||
|
// Returns: BOOL - TRUE if all addresses were successfully retrieved.
|
||
|
//
|
||
|
// History: nickball Created 1/5/98
|
||
|
//
|
||
|
//+----------------------------------------------------------------------------
|
||
|
BOOL BindLinkage(HINSTANCE hInstDll, LPCSTR *ppszPfn, void **ppvPfn)
|
||
|
{
|
||
|
MYDBGASSERT(ppszPfn);
|
||
|
MYDBGASSERT(ppvPfn);
|
||
|
|
||
|
UINT nIdxPfn;
|
||
|
BOOL bAllLoaded = TRUE;
|
||
|
|
||
|
for (nIdxPfn=0;ppszPfn[nIdxPfn];nIdxPfn++)
|
||
|
{
|
||
|
if (!ppvPfn[nIdxPfn])
|
||
|
{
|
||
|
ppvPfn[nIdxPfn] = GetProcAddress(hInstDll, ppszPfn[nIdxPfn]);
|
||
|
|
||
|
if (!ppvPfn[nIdxPfn])
|
||
|
{
|
||
|
CMTRACE3(TEXT("BindLinkage(hInstDll=%d,ppszPfn=%p,ppvPfn=%p)"), hInstDll, ppszPfn, ppvPfn);
|
||
|
CMTRACE3(TEXT("\tGetProcAddress(hInstDll=%d,*pszProc=%S) failed, GLE=%u."), hInstDll, ppszPfn[nIdxPfn], GetLastError());
|
||
|
|
||
|
bAllLoaded = FALSE;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return (bAllLoaded);
|
||
|
}
|