最近在看duilib的源码, CRenderEngine::DrawImage中有两行代码
typedef BOOL (WINAPI *LPALPHABLEND)(HDC, int, int, int, int,HDC, int, int, int, int, BLENDFUNCTION);
static LPALPHABLEND lpAlphaBlend = (LPALPHABLEND) ::GetProcAddress(::GetModuleHandle(_T("msimg32.dll")), "AlphaBlend");
可以看到先用typedef定义一个函数指针类型,参数跟AlphaBlend函数的参数一致,AlphaBlend函数的参数如下,
BOOL AlphaBlend( HDC hdcDest,
int nXOriginDest,
int nYOriginDest,
int nWidthDest,
int nHeightDest,
HDC hdcSrc,
int nXOriginSrc,
int nYOriginSrc,
int nWidthSrc,
int nHeightSrc,
BLENDFUNCTION blendFunction
);
然后就是两个重要的全局函数::GetModuleHandle和::GetProcAddress,从msimg32.dll中获取dll的模块句柄作为::GetProcAddress的实参,::GetProcAddress动态链接库(DLL)中的输出库函数地址给到上面定义的函数指针类型定义的变量,通过该变量就可以使用dll中的函数了。