MFC动态库的创建与使用详解

一、创建动态库

        新建工程--->MFCDLL--->DLL类型(我选的是MFC扩展DLL,第一个也可以)--->添加头文件(只要头文件,用来声明接口函数(纯虚函数)),如下

#ifndef _IMYDLLPORT_H

#define _IMYDLLPORT_H

class IDllPort

{

public:

        virtual BOOL ExportFile(LPCSTR lpInputStr, int iStrLen, LPCSTR lpFilePath) = 0; };

#endif

PS:动态库的类不用C开头而是I

        然后再次添加头文件和cpp文件

头文件

头文件创建类来继承我们之前声明的类,然后去实现它,(记得包含要继承的类的头文件)如下:

#include "IMyDllPort.h"

class CLogToFile : public IDllPort

{

public:

        BOOL ExportFile(LPCSTR lpInputStr, int iStrLen, LPCSTR lpFilePath) override;//输出字符串与时间到文件 };

CPP

cpp文件中为函数功能的具体实现,自行填写

再次在头文件中建立两个要导出的接口函数,同时在函数声明前添加 _declspec(dllexport) 关键字,如下

PS:这两个函数要放在类的外面,作为一个全局函数

//创建接口 extern "C" __declspec(dllexport) IDllPort* CreateInterface() { IDllPort* pInterFace = new CLogToFile; return pInterFace; } extern "C" __declspec(dllexport) void ReleaseInterFace(IDllPort* pInterFace) { delete pInterFace; pInterFace = NULL; }

这两个函数的功能为返回一个类指针和释放这个类指针

最后点击生成解决方案可以在工程目录的 debug 目录或者 release 目录下(这取决你生成的是debug版本还是release版本)生成了动态链接库的相关文件。第三方调用时关键的文件为 .lib文件 和 .dll文件 以及工程目录下的 .h头文件 。

二、使用动态库

1.找到刚刚DLL工程的debug目录,把生成的5个文件(dll、exp、ilk、lib、pdb)全部复制到我们要使用动态库工程里面的debug目录下,

2.把刚刚DLL工程的头文件(纯虚函数的那个)添加到要使用动态库的工程名目录(工程下面有一个同名目录)中,然后在工程中--->解决方案资源管理器--->头文件--->右键添加项--->现有项,添加这个头文件

3.在使用处的头文件中先调用我们刚刚添加的头文件#include “头文件名”,然后添加下面代码

typedef LPVOID (_cdecl * RC_NEW_INTERFACE)(); typedef void (_cdecl * RC_RELEASE_INTERFACE)(LPVOID pInstance);

这段的作用是最开始在包含纯虚函数的那个头文件中的两个全局函数,我们后续通过RC_NEW_INTERFACE和RC_RELEASE_INTERFACE去获取函数指针

4.在调用我们写的功能函数处,添加下段代码

//加载动态库函数

HINSTANCE hDll;//DLL句柄

hDll=::LoadLibrary(_T("MyDLLProject.dll"));//动态加载DLL模块句柄

//得到所加载DLL模块中函数的地址

RC_NEW_INTERFACE pfnCreate =(RC_NEW_INTERFACE)GetProcAddress(hDll,"CreateInterface");

if(!pfnCreate)

{

         int nError = GetLastError();

        AfxMessageBox(_T("调用创建接口函数失败"));

         return;

}

//这时得到的 pIDllCreate() 返回值是void型,需要强转

IDllPort* pIDllPort = (IDllPort*)pfnCreate();

//调用动态库里面封装的日志输出到文件函数

BOOL bImport = pIDllPort->ExportFile(lpInput,iStrLen,lpFilePath); //删除接口 RC_RELEASE_INTERFACE pfnRelease = (RC_RELEASE_INTERFACE)GetProcAddress(hDll,"ReleaseInterFace");

if(!pfnRelease)

{

        int nError = GetLastError();

        AfxMessageBox(_T("调用删除接口函数失败"));

        return;

}

pfnRelease(pIDllPort);

代码含义:

先构建一个DLL模块句柄,然后创建一个函数指针去获取动态库中的全局函数,CreateInterface返回给我们一个类指针,我们通过这个指针就可以去使用类中的函数了,使用完后要及时释放,再次创建函数指针同上,(两次的宏不同,创建是new,释放是release)

代码中添加了判断,可去除,但是调适时要断点检测。

//静态绑定,便于调试

#pragma comment (lib,"TimeStrSave.lib")

把lib文件调到放头文件的目录下

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值