DLL调用

作者: Junior888 | 来源:发表于2018-08-14 21:25 被阅读0次

    使用VS2012生成DLL文件(1)
    在C++中调用DLL中的函数(2)
    在C++中调用DLL中的函数(3)
    在VS2012中采用C++中调用DLL中的函数(4)
    lib 和 dll 的区、生成以及使用详解


    首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。
    静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件
    动态库:动态链接库是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。在vs中新建生成动态库的工程,编译成功后,产生一个.lib文件和一个.dll文件

    那么上述静态库和动态库中的lib有什么区别呢?
    静态库中的lib:该LIB包含函数代码本身(即包括函数的索引,也包括实现),在编译时直接将代码加入程序当中
    动态库中的lib:该LIB包含了函数所在的DLL文件和文件中函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供

    总之,lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。


    1. 生成DLL文件

    1.1 创建DLL工程

    文件->新建->项目->visual c++->win32->win32控制台应用程序(win32项目也可以)
    填写项目名称MyDLL->确定->下一步->DLL(附加选项 对空项目打钩)->完成。

    到这里DLL工程就创建完毕了,下面新建两个文件MyDLL.cpp和MyDLL.h。

    MyDLL.cpp内容如下:

    using namespace std;
    #include "MyDLL.h"
    
    int Add(int &a,int &b) 
    {
      return a+b;
    }
    

    MyDLL.h内容如下:

    #pragma once 
    extern "C" __declspec(dllexport) int Add(int &a,int &b); 
    

    点击生成Bulid -->Bulid MyDLL,dll文件就生成了,vs2008不能直接生成lib文件,这个时候就需要我们在建立dll工程的时候 再新建一个def文件,默认生成然后重新生成就能够得到lib文件了,但可以通过修改工程属性里面的general->project default->configure type修改为lib,就可以生成lib文件。

    注意:如果在已存在的工程上创建dll或者lib,不需要修改工程,只要把工程属性里面的general->project default->configure type修改为lib或者dll,就可以生成lib文件或者dll文件了。

    1.2 在C++中使用刚才生成的DLL文件

    新建一个win32 控制台工程,取名testMyDLL,新建两个文件:testMyDLL.cpp和testMyDLL.h

    首先需要 隐式链接采用静态加载的方式,比较简单,需要.h、.lib、.dll三件套。新建“控制台应用程序”或“空项目”。配置如下:(这一点非常重要)

    项目->属性->配置属性->VC++ 目录-> 在“包含目录”里添加头文件MyDLL.h所在的目录
    项目->属性->配置属性->VC++ 目录-> 在“库目录”里添加头文件MyDLL.lib所在的目录
    项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里添加“MyDLL.lib”(若有多个 lib 则以空格隔开)

    testMyDLL.cpp内容如下:

    #include "testMyDLL.h" 
    #pragma comment(lib,"..\\debug\\MyDLL.lib")//可以写成绝对路径,但是路径一定要用\\来指明,即:J:\\Pr//ograms\\C++\\Practice\\DLLTEST\\DLLtest\\Debug\\MyDLL.lib"
    using namespace std; 
     
    int main() 
    { 
        int a =3; 
        int b =2; 
        cout<<Add(a,b)<<endl; 
     
        getchar(); 
     }
    

    testMyDLL.h内容如下:

    #pragma once 
    extern "C" _declspec(dllexport) int Add(int &a,int &b); 
    

    现在可以编译通过了,但是程序运行就报错,还需要将MyDLL.dll复制到当前项目生成的可执行文件所在的目录。(这一点非常重要)
    这里需要注意testMyDLL.cpp文件中调用lib的这句话:
    #pragma comment(lib,"..\debug\MyDLL.lib")

    这里需要指明lib所在的文件夹,当然我们也可以在生成dll的MyDLL工程中,指定lib和dll文件的输出路径,直接到testMyDLL工程下。

    注意:如果只有dll文件,那么必须在程序里面调用LoadLibrary()函数才能使用,如果有lib文件,那么有两种方式可以马上进行调用

    相关文章

      网友评论

          本文标题:DLL调用

          本文链接:https://www.haomeiwen.com/subject/tkrhattx.html