• 动态链接库编程范例


    我们经常在做各种二次开发的时候都会使用卖方提供的SDK进行开发,往往卖方并不愿理提供给我源程序而是给我一个提供

    一系列函数接口说明和一些封装的动态链接库。

     

    今天我们就要说说静态链接库和动态链接库,静态链接库往往以lib后缀结尾,然而动态链接库往往以dll后缀结束。是我

    们不能仅仅以后缀名作为它们二者的区别,比如动态链接库也可能存在lib后缀的文件,然而这种情况下lib文件是保存一

    些函数符号,正则的提供运行代码的指令部分仍然存在在dll文件中。

     

    其实从本质上来说,动态链接库是我们再运行程序的时候在进行链接,然而静态链接库的代码指令是直接包含在最终的应用

    序中,所以我们有使用的动态链接库在生成最终的程序里,如果一旦将该动态链接库文件删除,程序将提示确实xxx.dll文件。

    然而使用静态链接库生成的最终程序里,我们直接删除静态链接库文件,程序仍然将正常执行。因为在生成程序的过程中,静

    态链接库中的代码指令已经完全的嵌入到了应用程序中了。windows提供的大多数服务都是以dll形式提供的。然而静态链接库

    然可移植性强,但是会造成程序很庞大,所以往往大多数开发接口都是以动态链接库的形式提供的。

    下面将展示一个简单的动态链接库的范例:
    1.打开vc++6.0新建一个动态链接库工程,取名为Dlldemo:

    2.创建一个空的DLL工程:

    3.我们添加一个头文件为AddDll.h 一个源文件为AddDll.cpp在本范例中我们将要把下面这个函数封装为动态链接

    库提供给第三方开发:

    int Add(int a,int b)
    {
        return a+b;
    }

    4.我们在头文件里添加需要导出的函数的声明:

    1 extern "C" _declspec(dllexport) int Add(int a,int b);

    5.然后在源文件里面实现这个导出函数:

    1 #include "AddDll.h"
    2 
    3 int Add(int a,int b)
    4 {
    5     return a+b;
    6 }

    6.编译工程,此时便在工程目录下生成了我们需要的dll文件,如下图所示:

    其中AddDll.h提供动态链接库导出函数的声明,Dlldemo.dll文件提供了实际导出函数的实现代码,不过不再是源代码的

    形式。Dlldemo.lib提供了导出函数的一些符号列表。

    至此动态链接库便成功生成了。

    下面我们用一个例子测试:

    1.新建一个测试工程为test,在工程中添加一个test.cpp用于测试

    2.将上面的三个文件拷贝到test工程目录

    3.将Dlldemo.lib用以下两种方式中的一种链接到程序:

        一.通过工程-设置-链接-对象/库模块中 添加Dlldemo.lib

        二.或者在程序通过#pragma comment(lib,"Dlldemo.lib")

    4.在test.cpp包含头文件AddDll.h,同时用以下测试代码:

     1 #include "AddDll.h"
     2 #include <iostream>
     3 using namespace std;
     4 #pragma comment(lib,"Dlldemo.lib")
     5 int main()
     6 {
     7     int num1,num2;
     8     cout<<"Please input the two number:"<<endl;
     9     cin>>num1;
    10     cin>>num2;
    11     int AddResult;
    12     AddResult=Add(num1,num2);
    13     cout<<"The Add Result is: "<<AddResult<<endl;
    14     return 0;
    15 }

    运行结果:

    测试成功咯!!!

  • 相关阅读:
    Spark项目之电商用户行为分析大数据平台之(十二)Spark上下文构建及模拟数据生成
    Spark项目之电商用户行为分析大数据平台之(十一)JSON及FASTJSON
    Spark项目之电商用户行为分析大数据平台之(十)IDEA项目搭建及工具类介绍
    Spark项目之电商用户行为分析大数据平台之(九)表的设计
    Spark项目之电商用户行为分析大数据平台之(八)需求分析
    Photoshop 使用阈值调整色阶
    Netty 中 IOException: Connection reset by peer 与 java.nio.channels.ClosedChannelException: null
    Hadoop + ZK + HBase 环境搭建
    ArrayBlockingQueue, LinkedBlockingQueue, ConcurrentLinkedQueue, RingBuffer
    Redis 性能问题的记录
  • 原文地址:https://www.cnblogs.com/vpoet/p/4690530.html
Copyright © 2020-2023  润新知