运行时加载DLL

来源:互联网 发布:手机上淘宝网怎么付款 编辑:程序博客网 时间:2024/06/06 05:49
使用DLL有两种方法,一种是启动时加载DLL,另一种就是运行时加载DLL,之前的一篇博文用的就是启动时加载DLL,现在来看看运行时是如何加载DLL的还是之前的那个项目,只不过添加了两个函数(W版本的和A版本的)

这里写图片描述
这是源文件

.cpp

# include<Windows.h># include"标头.h"//Dll入口函数就是DllMain,DllMain既是入口点,也是出口点int WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, PVOID pvReserved){    switch (fdwReason)    {    case DLL_PROCESS_ATTACH:       //(加载DLL)        //将dll附加到进程的地址空间里,之后dll是作为一个独立的线程执行的        MessageBox(NULL, TEXT("DLL被加载了!"), TEXT("DLL"), MB_OK);        break;    case DLL_THREAD_ATTACH:        //新建线程        //略        break;    case DLL_THREAD_DETACH:        //线程退出 ,退出是线程先退出        //略        break;    case DLL_PROCESS_DETACH:       //释放DLL        //略        break;    }    return TRUE;}//任何一个dll中的函数前都要加extern "C" _declspec(dllexport),至少要加_declspec(dllexport)(意思是声明为dll的导出函数,只有导出函数//才可以被其他的项目在调用该dll时调用,不声明的话该函数只能在该dll内部调用,无法在外部被调用)//如果是被c++调用,还要加上extern "C",c调用就不加,所以在头文件里利用宏来处理//=====================启动时加载DLL:使用h文件和lib文件=============================//使用h文件和lib文件(别忘了dll文件)EXPORT BOOL CALLBACK funA(HDC hdc,PRECT pRc,PCSTR pString)//测试里就可以调用该函数{    int iLength;    SIZE size;//保存字符串尺寸(高度和宽度)的结构    iLength = lstrlenA(pString);//字符串长度    GetTextExtentPoint32A(hdc, pString, iLength, &size);    return TextOutA(hdc, (pRc->right - pRc->left - size.cx) / 2,        (pRc->bottom - pRc->top - size.cy) / 2, pString, iLength);}EXPORT _declspec(dllexport) BOOL CALLBACK funW(HDC hdc,PRECT pRc,PCWSTR pString){    int iLength;    SIZE size;//保存字符串尺寸(高度和宽度)的结构    iLength = lstrlenW(pString);//字符串长度    GetTextExtentPoint32W(hdc, pString, iLength, &size);    return TextOutW(hdc, (pRc->right - pRc->left - size.cx) / 2,        (pRc->bottom - pRc->top - size.cy) / 2, pString, iLength);}//===============================================================================//=======运行时加载DLL: 使用LoadLibrary(),GetProcessAddress()======================EXPORT DWORD DemoA(){    MessageBoxA(NULL, "这是动态链接库的函数", "DLL", MB_OK);    return 0;}EXPORT DWORD DemoW(){    MessageBoxW(NULL, L"这是动态链接库的函数", L"DLL", MB_OK);    return 0;}//===============================================================================

然后重新生成一下该项目,然后新建一个项目测试一下,
这里写图片描述
第一个按钮加载DLL,第二个调用DLL里的函数,第三个释放DLL
这里写图片描述
这就是运行时加载DLL
这里写图片描述
这里写图片描述

0 0