显式调用DLL一般步骤:LoadLibary,GetProAddress,FreeLibary
当DLL中涉及较多接口函数的时候,灵活使用一些宏定义既能使代码编写变得简单也能使代码风格更加美观
eg.
函数类型头文件中
//MyDLLApi.h
typedef bool (*ApiTypeFunctionOne)(参数列表);
typedef bool (*ApiTypeFunctionTwo)(参数列表);
typedef bool (*ApiTypeFunctionThree)(参数列表);//等等函数...............
在封装接口函数的类头文件中
///MyDLLFunClass.h
#define APIDLL_FILENAME _T("Name.dll")
#define FUN_DECLARE(FuncName) ApiType##FuncName m_pfn##FuncName;
#define REGPROCADDR(pfnAttr, pfntype, fnName) \
{ \
pfnAttr = (pfntype)GetProcAddress(m_hDll, fnName); \
if (NULL == pfnAttr) \
{ \
TRACE_ERROR1(MOD_TYPE_DEFAULT, _T("GetProcAddress failed! sfnName = %s"), \
#fnName); \
return FALSE; \
} \
}
#define FUNCTION_LOAD(FuncName)\
REGPROCADDR(m_pfn##FuncName, ApiType##FuncName, #FuncName)
Class MyDllInterface
{
FUNC_DECLARE(FunctionOne)
FUNC_DECLARE(FunctionTwo)
FUNC_DECLARE(FunctionThree)//等等
};
在封装接口函数的类实现文件中
///MyDLLFunClass.cpp
MyDllInterface::MyDllInterface()
{
m_pfnFunctionOne = NULL;
m_pfnFunctionTwo = NULL;
m_pfnFunctionThree = NULL;//等等
}
`MyDllInterface::MyDllInterface()
{
m_pfnFunctionOne = NULL;
m_pfnFunctionTwo = NULL;
m_pfnFunctionThree = NULL;//等等
}
MyDllInterface::LoadFunction()
{
ASSERT(NULL == m_hDll);
m_hDll = LoadLibrary(APIDLL_FILENAME);
if (NULL == m_hDll)
{
TRACE_ERROR0(MOD_TYPE_DEFAULT, _T("LoadLibrary Error!"));
return FALSE;
}
FUNCTION_LOAD(FunctionOne)
FUNCTION_LOAD(FunctionTwo)
FUNCTION_LOAD(FunctionThree)//等等
}