DLL封装技巧

显式调用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)//等等
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值