• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

VS生成自己的DLL并调用

武飞扬头像
aspiretop
帮助1

目录

一、生成dll

二、调用dll

三、从dll中导出函数的define

四、dll解读


一、生成dll

新建空项目,然后在属性里更改这两个地方

学新通

代码如下:

fun.h

  1.  
    //fun.h
  2.  
    #pragma once
  3.  
    #include<iostream>
  4.  
    //定义导出函数,DLLEXAMPLE_EXPORT_API在函数类型前,若是类,则在class和类名之间
  5.  
    #define DLLEXAMPLE_EXPORT_API __declspec(dllexport)
  6.  
     
  7.  
    DLLEXAMPLE_EXPORT_API int add(int a, int b);

 fun.cpp

  1.  
    #include"fun.h"
  2.  
     
  3.  
    DLLEXAMPLE_EXPORT_API int add(int a, int b)
  4.  
    {
  5.  
    return a b;
  6.  
    }

然后选择生成项目,此时会生成一个dll和一个lib,lib说明函数具体位置,dll说明函数具体内容

学新通

二、调用dll

新建空白项目,直接使用dll的头文件,并添加一个cpp源文件,直接使用头文件里面的函数即可,因为dll项目里面已经定义了可以在外部项目,通过dll调用函数

main.cpp 

  1.  
    #include"fun.h"
  2.  
    #pragma comment(lib, "dll.lib")
  3.  
     
  4.  
    int main()
  5.  
    {
  6.  
    std::cout << "输出a b=" << add(9, 6) << std::endl;
  7.  
    return 0;
  8.  
    }

运行此项目时,必须把dll和lib复制到源码所在的路径下 

学新通

三、从dll中导出函数的define

  1.  
    #define MYDLL2_API __declspec(dllexport)
  2.  
    #else
  3.  
    #define MYDLL2_API __declspec(dllimport)
  4.  
    #endif

可以使用这个更为全面,可以从dll导入导出函数

四、dll解读

  • 若有两个具有依赖关系的动态链接库fun1.dll和fun2.dll,fun2.dll依赖fun1.dll

fun1.dll包含函数

  1.  
    void fun1()
  2.  
    {
  3.  
    printf("fun1功能\n");
  4.  
    }
  5.  
     
  6.  
    void fun11()
  7.  
    {
  8.  
    printf("fun11功能\n");
  9.  
    }

fun2.dll包含函数

  1.  
    void fun2()
  2.  
    {
  3.  
    fun1();
  4.  
    printf("fun2功能\n");
  5.  
    }
  6.  
     
  7.  
    void fun22()
  8.  
    {
  9.  
    fun1();
  10.  
    }

若此时在外部调用上述各功能,则需要根据函数所在位置,调用所需的dll,例如若要调用fun2函数,则只用使用fun2.h、fun2.lib、fun2.dll;但是若要使用fun1函数,则仅调用fun2.dll是没用的,fun2.dll里面没有fun1这个函数,此时只能把fun1.h、fun1.lib、fun1.dll都加上才能用fun1函数。

另外一个曲线救国的方法是在fun2.dll定义一个fun22函数,让它执行fun1函数,这时候运行fun22函数就不需要fun1.dll了,它属于fun2.dll独立的函数了。

  • dll的名称比较敏感,因为编译的时候就固定死了,不能随便修改,比如Debug模式下,编译生成fun.dll,此时不能修改Debug模式下的动态链接库为fund.dll,这样会导致找不到fun.dll
  • lib库的名字不敏感,可以随意修改,调用的时候指明链接的lib即可

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggehcf
系列文章
更多 icon
同类精品
更多 icon
继续加载