• 动态链接库知识点归纳之一(DLL概念,如何建立,如何使用,如何优化,如何查看)


    简单的总结一些动态链接库的一些知识,方便以后查找。

    首先,新建一个动态链接库

    (1)      打开编辑器,选择WIN32项目, dll,如下图,项目名字为:test,选择空项目。如下图


    (2)      增加一个源文件,名字是:dll,如下图



    (3)      编辑动态链接库就是为了使用动态链接库中的函数等一些东西,在这里,我们在原文件中编写两个函数(在函数头前加入_declspec(export)这是告诉编译器,此函数为“导出”函数,只有导出函数,我们才可以在其他程序中引用)。然后点击编译,如下图。



    (4)      此时一个简单的动态链接库已经建立了,我们可以通过VS编译器自带的一个程序来检测我们导出的函数有哪些,首先我们要找到,.dll所在的文件夹,拷贝一下他所在的路径,在命令行下输入如下语句(dumpbin –exports + .dll所在路径)并在其后附上路径,回车,具体步骤如下图




    (5)      我们可以看到,有两个函数,表示有两个函数是导出函数,尽管函数名是乱码(这个问题在后续会解决,此问题是因为编译器 名字改编)

    (6)      此时,这两个函数我们可以在其他程序中使用了,首先我们新建一个对话框程序(项目名称:testdll),在其上添加两个按钮,其属性修改为如下图,此时我们要应用动态链接库中的两个函数,我们要把动态链接库中,.dll和.lib文件拷贝到当前的项目路径下。


      


    (7)      我们把写好的.dll文件放到debug目录下(.dll文件只要放在testdll工程下即可,因为编译器会自动一级一级目录查找),但是要把把.lib文件拷贝到testdll程序所在的目录下,如下图,





    此时我们要在VS编辑器下,在链接器中输入test.lib,然后应用,确定,这样才能让编译器找到引入库文件。如下图



    (8)      此时,我们需要使用两个函数,还必须在程序中声明这两个函数是在外部定义的,是所在程序的”导入函数”,如下图。


    (9)      我们为两个按钮建立消息响应函数,并编写如下代码,并且包含头文件



    (10)  Ctrl +F5 运行,点击按钮,可以正常的使用函数。


    (11)  这是我们以隐式链接方式加载dll的方法。

    在此,简单的介绍下,拷贝.dll和.lib文件的作用以及意义。

    使用动态库时候,我们需要向程序提供两个文件,有一个引入库文件(.lib)和一个DLL(.dll)文件,对于一个DLL,其中引入库(.lib)包含该DLL导出的函数和变量的符号名,而.dll包含的是该DLL实际的函数和数据,在编译链接的时候,我们值需要引入库,而在程序执行的时候,才需要去加载DLL中导出的函数(这样才符合“动态链接库”这几个字的含义嘛)。




    我们总结了如何建立以及使用DLL,但是仍有缺点,我们在使用第三方DLL时候,如果不通过一些工具(例如,dumpbin.exe等)是很难知道DLL中有哪些函数,此时我们可以使用一个技巧,就是在编写DLL时,我们把导出的函数统一放在一个头文件中(.h),使用DLL时,我们把头文件一同拷贝到程序的工程目录下,这样客户可以查看头文件,从而得到导出函数,对此

    (1)      我们在dll项目中,增加一个头文件,在其中输入导出函数的声明,如下图




    (2)      我们使用条件编译,这可以让一个头文件,发挥两个作用,不仅可以再DLL中声明“导出函数”,还可以在应用程序中声明DLL的“导入函数”

    (3)      我们把新编辑好的DLL,重新生成,注意:每次我们只要修改DLL中的东西,我们都必须重新生成,然后把新生成的.dll和.lib文件拷贝到应用程序的目录下(现在当然也需要拷贝.h文件,.h文件与.lib放在一起就行),这一点很重要。

    (4)      点击F7,运行,结果与优化之前的一样。


     下一篇将会总结一下生成DLL时出现名字改编的问题,以及解决办法。以及如何在DLL中添加一个c++的类。(http://blog.csdn.net/u014028070/article/details/38510559点击打开链接

  • 相关阅读:
    android提供ToolBar实现划动菜单的陷阱
    style="display"之后不能获取offsetHeight或clientWidth这类测量的值
    onmouseenter与onmouseover
    使用Dom的Range对象处理chrome和IE文本光标位置
    js严格模式“use strict”
    正则表达式lastIndex属性浅析
    IE中的fireEvent和webkit中的dispatchEvent
    readonly=“readonly”与readonly=“true”
    【杂文】
    【洛谷p1015】【一本通p1309】回文数(noip1999)
  • 原文地址:https://www.cnblogs.com/zhangruilin/p/5769854.html
Copyright © 2020-2023  润新知