MFC动态链接库调用详解

来源:互联网 发布:我的世界pe创世神js 编辑:程序博客网 时间:2024/06/13 04:32

MFC动态链接库的调用,有好多种方式,这里只介绍一种简单的调用的方式,只需要把动态链接库编译后的.dll文件放到调用界面的Debug下面。再在界面需要调用动态链接库里添加相关函数就行了。找了好多资料,发现没有详细的介绍,下面就是从动态链接库建立开始,一点点详细的介绍。

首先是,动态链接库的建立。我们这里讲的是MFC的标准库的建立。用的是vs2010。
我们建立一个名为TestDLL的动态链接库。
这里写图片描述

然后,我们这里实现一个小程序,在动态链接库里返回四个点,用来画一个矩形。

首先,我们写的是动态链接库里的内容,先不考虑界面的问题。

我们在动态链接库里新建一个类,用来储存矩形的四个点。注意,这里的类名不要起的很常见,例如,CDrawRect这样的类,因为很有可能和MFC内部已有的类冲突,从而会出现显示调用不明确的情况。
这里写图片描述

上面出现的warning“找不到符号唯一的匹配项错误”,是因为在mfc中已经有定义。

这里写图片描述

所以,我们起类名字时,要注意这点。
这里写图片描述

然后,我们在新建的类中添加一个公有成员函数,名字叫做

CPoint* GetPoint();

这样,就建立一个函数,里面返回的是矩形的点的数组的指针。这样,就能通过地址来调用数组里面的一串值了。

在.cpp里,写下:

CPoint* CDrawRectPoint::GetPoint(){    CPoint getPoint[4];    getPoint[0].x=100;    getPoint[0].y=100;    getPoint[1].x=100;    getPoint[1].y=500;    getPoint[2].x=500;    getPoint[2].y=500;    getPoint[3].x=500;    getPoint[3].y=500;    return getPoint;}

这里,我们为了养成一个良好的习惯,要把动态链接库的接口专门在一个派生类中写出来,这样,就会在导出的时候,我们只需要对接口进行处理就好了。并且,在提交项目时,也只需要提供.dll和接口类就好,可以有效的保证自己代码的安全和核心代码的利益。

于是,我们新建一个派生类,从CDrawRectPoint类里派生出来一个类,名字叫做CDrawRectPointIO。

#include "drawrectpoint.h"class CDrawRectPointIO:    public CDrawRectPoint{    //说明:没有把构造函数析构函数写出来    CPoint* GetPoint();}

在.cpp里:

CPoint* CDrawRectPointIO::GetPointIO(){    return GetPoint();}

好了,上面是动态链接库里的内容已经写出来,下面是写出动态链接库的调出。

在CDrawRectPointIO.h文件中,在最开始的部分,加上:

//即把导出的函数声明为全局的,并且声明为外部可调用extern "C" __declspec(dllexport)CPoint* __stdcall GetPointIO();

这里写图片描述

然后,再在源文件里的.def文件里,添加导出的函数的名称,因为这个是不加变量,只有函数名称的,所以,这也是前面提到的为什么函数命名时尽量不要用太常见的函数名的原因。

这里写图片描述

之后是调试,在Debug里得到.dll。到这里就是动态链接库的导出过程。

然后是动态链接库在界面中的调用。

新建一个MFC单文档类。名字叫做TestEXE,设置成MFC标准。这里为了方便画,直接就在OnDraw(CDC*pDC)函数里写了,实际上不推荐在这个函数里调用动态链接库,因为系统里会不断的自动刷新OnDraw()函数,所以,为了安全起见,我们最好不要用在OnDraw()函数里写。这里,我们用一个控制变量来控制是否启用动态链接库。

首先,是建立之后,F5调试程序。生成Debug,把前面动态链接库生成的.dll复制粘贴到界面的Debug里。

在资源视图里的Menu里添加菜单栏,并把ID修改。类向导到view里。

这里写图片描述

在view.h里添加成员变量,int m_nControl;在构造函数里初始化为0。

在view.cpp里,对刚才添加的OnRect()函数里,添加控制变量。

void CTestEXEView::OnRect(){    // TODO: 在此添加命令处理程序代码    m_nControl = 1;    Invalidate();}

下面先是对动态链接库的调用,在view.cpp里,在文件头下添加如下:

typedef CPoint*(WINAPI *dllDraw)();

在OnDraw里添加:

if(1 == m_nControl)    {        HINSTANCE hDLL;         hDLL=LoadLibrary("TestDLL.dll");//加载动态链接库MyDll.dll文件;        if(hDLL == NULL)          {              MessageBox("无法载入dll\n");              FreeLibrary(hDLL);          }        dllDraw DrawNew;        DrawNew=(dllDraw)GetProcAddress(hDLL,"GetPointIO");        if(DrawNew == NULL)          {              MessageBox("第二步无法载入dll\n");              FreeLibrary(hDLL);           }         CPoint *m_point = new CPoint[4];        m_point = DrawNew();        CPoint point[4];        for(int i=0;i<4;i++)        {            point[i]=m_point[i];        }        pDC->MoveTo(m_point[0]);        pDC->LineTo(m_point[1]);        pDC->LineTo(m_point[2]);        pDC->LineTo(m_point[3]);        pDC->LineTo(m_point[0]);        FreeLibrary(hDLL);        m_nControl=0;        delete []m_point;        m_point = NULL;    }

最后得到结果如图:

这里写图片描述

以上就是全部内容了。

0 0
原创粉丝点击