zoukankan      html  css  js  c++  java
  • 动态链接库的简单应用和学习

    好奇心,完全是好奇心,让我开始看看DLL(动态链接库知识)初涉一下,软件背后的故事!

    简单应用:

    建立 jisuan.h文件 打入一下代码

    1 extern "C"_declspec(dllexport)int add(int i,int j);
    2 extern "C"_declspec(dllexport)int sub(int i,int j);
    3 extern "C"_declspec(dllexport)int mull(int i,int j);
    4 extern "C"_declspec(dllexport)float divv(int i,int j);

    分别定义了加减乘除四则运算的函数!

    建立 jisuan.cpp文件 打入一下代码

     1 #include "jisuan.h"
    2 int add(int i,int j)
    3 {
    4 return i + j;
    5 }
    6 int sub(int i,int j)
    7 {
    8 return i - j;
    9 }
    10 int mull(int i,int j)
    11 {
    12 return i * j;
    13 }
    14 float divv(int i,int j)
    15 {
    16 return i/(float)j;
    17 }

    四则运算的定义在此

    用VC编译在debug文件里面的这两个文件就是程序编译的果子了:

    那么,怎么用他们呢?

    下面建立一个计算器工具:

    用MFC对话框的形式设计成如图的样子并为编辑框添加两个变量:m_a,m_b;

    然后分别为按钮添加点击事件:(列出了求和的)

     1 void CDllUsingDlg::OnBtnAdd() 
    2 {
    3 // TODO: Add your control notification handler code here
    4 UpdateData(TRUE);
    5 CString str;
    6 int he=add(m_a,m_b);
    7 str.Format("%d和%d的和为:%d!",m_a,m_b,he);
    8 AfxMessageBox(str);
    9
    10
    11 }

    结果是..........

    五个错误,好熟悉啊!对,没有链接库的时候,就是他!哈哈,我们只是异想天开的用了里面的函数了,却没有告诉程序去哪找?

    用过iostream.h知道需要include“iostream.h”这个也是一样的!

    我们下一步工作:

    1.将dll文件放到工程文件夹下面,将lib文件放到debug下面

    2.到VC里面,工程(project)--->设置(setting)---->连接(link)写上lib的名字!

    3.#include“Youdll.h”

    4.运行 

    没问题了!用用,可以,就跟cout<<"ss"<<endl; 一样方便哦!

    应用到此,下面写下自己学到的,分享一下:

    lib是编译时需要的,dll是运行时需要的。 

    在VC里面两步完成exe!

    1.编译:要完成源代码的编译,用的就是lib!

    2.连接:如果也使动态连接的程序运行起来,用dll。
    所以都用得上!

    这种方法就是大名鼎鼎的 :动态连接!

    “在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。”-------大牛如是说!

    导入库并非在程序里要用的,它保存了函数执行的地址符号表,只是为了确保在执行函数时能够准确找到需要的函数!真正的要执行函数体就在dll里面!

    静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息----------大牛如是说!

    好了,这就是我知道的链接库的问题!

    其实好多地方都用到了dll,比如 各种API函数 (包括windows的)

    一下是我转载的

    动态链接库 (DLL) 是作为共享函数库的可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。 
    动态链接与静态链接的不同之处在于它允许可执行模块(.dll 文件或 .exe 文件)仅包含在运行时定位 DLL 函数的可执行代码所需的信息。在静态链接中,链接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中。 
    使用动态链接代替静态链接有若干优点。DLL 节省内存,减少交换操作,节省磁盘空间,更易于升级,提供售后支持,提供扩展 MFC 库类的机制,支持多语言程序,并使国际版本的创建轻松完成。

    API 就是应用程序编程接口。它是能用来操作组件、应用程序或者操作系统的一组函数。典型的情况下,API 由一个或多个提供某种特殊功能的 DLL 组成。 
    DLL 是一个文件,其中包含了在 Microsoft? Windows? 下运行的任何应用程序都可调用的函数。运行时,DLL 中的函数动态地链接到调用它的应用程序中。无论有多少应用程序调用 DLL 中的某个函数,在磁盘上只有一个文件包含该函数,且只在它调入内存时才创建该 DLL。 
    您听到最多的 API 可能是 Windows API,它包括构成 Windows 操作系统的各种 DLL。每个 Windows 应用程序都直接或间接地与 Windows API 互动。Windows API 保证 Windows 下运行的所有应用程序的行为方式一致。 

    推荐两个博客:1.http://www.cnblogs.com/strinkbug/archive/2007/04/24/725050.html

    2.http://www.cnblogs.com/chio/archive/2008/08/05/1261296.html

    静下心来看看,学习学习,有助于也好更加好理解,高效率的提高哦!

  • 相关阅读:
    BZOJ1059|矩阵游戏
    Tyvj3632|超级英雄Hero
    BZOJ1192 鬼谷子的钱袋
    BZOJ1003 ZJOI2006物流运输trans 0'
    BZOJ1008|HNOI2008 越狱
    添加setuptools脚本
    更新linux下python版本
    函数式编程正确姿势
    python 多线程操作数据库
    python with语句
  • 原文地址:https://www.cnblogs.com/leisure/p/2271173.html
Copyright © 2011-2022 走看看