前言

先简单介绍下DLL。DLL:Dynamic Link Library 动态链接库 是一个被其他应用程序调用的程序模块,其中封装了可以被调用的资源或函数DLL 文件属于可执行文件,它符合Windows系统的PE文件格式,不过它是依附于EXE文件创建的的进程来执行的,不能单独运行。为了演示调用DLL程序的2种方法,我们先建一个简单的DLL程序。

建一个简单的DLL程序

IDE 使用vs2015,新建工程DLLTest1,选择空项目,创建完毕 右击项目 -> 属性 -> 常规 -> 配置类型 选择 动态库.dll。还是上一张图吧。

添加头文件Calc.h 在头文件中添加导出函数add函数

#pragma onceextern "C" __declspec(dllexport) int add(int a, int b);

cpp文件中进行实现

#include "Calc.h"int add(int a, int b)
{return a + b;
}

生成解决方案,在Debug下生成 DLLTest1.dll和DLLTest1.lib

对DLL程序调用方式一

同样是新建空项目,添加main.cpp文件,将 DLLTest1.dll和DLLTest1.lib 拷贝到工程代码目录,然后项目添加添加现有项。项目目录如下
在这里插入图片描述

使用代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>#pragma comment(lib,"DLLTest1.lib")extern "C" int add(int a, int b);// 静态调用DLL库
void StaticUse()
{int sum = add(10, 20);printf("静态调用,sum = %d\n", sum);
}

方式一 是静态调用,在连接阶段 将DLL库信息编写到EXE文件中,当调用DLL库中的函数是会加重DLL库。#pragma comment(lib,“DLLTest1”)告诉连机器需要在FirstDll.lib文件中找到DLL中导出函数的信息。

对DLL程序调用方式二

方法一属于静态调用,其方式是通过链接器将DLL函数的导出函数写进可执行文件。现在使用第二种方式,相对前一种 是动态调用。动态调用不是链接时完成的,而是在运行时完成的。动态调用不会在可执行文件中写入DLL相关的信息。代码如下:

// 动态调用DLL库
void DynamicUse()
{// 运行时加载DLL库HMODULE module = LoadLibrary("DLLTest1.dll");if (module == NULL){printf("加载DLLTest1.dll动态库失败\n");return;}typedef int(*AddFunc)(int, int); // 定义函数指针类型AddFunc add; // 导出函数地址add = (AddFunc)GetProcAddress(module, "add");int sum  = add(100, 200);printf("动态调用,sum = %d\n",sum);
}

用到了以下2个函数:

// 根据DLL文件名 加载DLL
// suc,返回一个模块句柄
HMODULE WINAPI LoadLibrary(_In_ LPCTSTR lpFileName
);
// suc,返回lpProcName指向的函数名的函数地址。
FARPROC GetProcAddress(HMODULE hModule,LPCSTR  lpProcName
);

测试

测试代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>#pragma comment(lib,"DLLTest1.lib")extern "C" int add(int a, int b);// 静态调用DLL库
void StaticUse()
{int sum = add(10, 20);printf("静态调用,sum = %d\n", sum);
}// 动态调用DLL库
void DynamicUse()
{HMODULE module = LoadLibrary("DLLTest1.dll");if (module == NULL){printf("加载DLLTest1.dll动态库失败\n");return;}typedef int(*AddFunc)(int, int); // 定义函数指针类型AddFunc add;add = (AddFunc)GetProcAddress(module, "add");int sum = add(100, 200);printf("动态调用,sum = %d\n", sum);
}int main(char argc, char* argv[])
{StaticUse();DynamicUse();system("pause");return 0;
}

验证结果,和我们想象的一样。

完整项目

如果 有需要,这个2个工程这里下载。

C/C++:Windows编程—调用DLL程序的2种方法相关推荐

  1. [Windows][VC]开机自动启动程序的几种方法

    原文:[Windows][VC]开机自动启动程序的几种方法 很多监控软件要求软件能够在系统重新启动后不用用户去点击图标启动项目,而是直接能够启动运行,方法是写注册表Software\\Microsof ...

  2. java中调用dll文件的两种方法

    https://www.cnblogs.com/huozhong/p/5830485.html JNA地址:http://blog.csdn.net/shendl/article/details/35 ...

  3. vs 2017 制作Dll文件的两种方法,以及调用Dll文件的两种方法。

    近来学习制作Dll文件,看了几个视频教程,看了网上的例子,看了msdn上的例子.现在做个总结,以便来日回顾,同时也希望以大家相互交流学习. 注意1:用 method 1 named "Usi ...

  4. php调用python程序的五种方法及详解

    方法一 exec ( string $command [, array &$output [, int &$return_var ]] ) : string 备注: exec有3个参数 ...

  5. python编程(python调用dll程序)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 很多人说python的效率比较低,主要是没有分清什么时候用python.什么时候用c.对于网络. ...

  6. PB调用DLL的常见问题及处理方法

    PB调用DLL的常见问题及处理方法 首先,为方便描述,先假设有一个DLL文件,名称为 test.dll,里面有个函数叫test. 第一类:通用型标准DLL 1.调用约定问题.Windows系统的标准D ...

  7. python 需要在什么环境下运行_进入Python 环境进行编程并运行程序的三种方式

    越来越多人开始学习Python了,本篇介绍进入Python 环境进行编程并运行程序的三种方式,适合刚入门的小白参考.进入Python的前提是先下载安装Python软件,如下所示,建议下载最新版,安装过 ...

  8. android软件自动启动软件下载,Android编程实现应用程序开机自启动的方法

    本文实例讲述了Android编程实现应用程序开机自启动的方法.分享给大家供大家参考,具体如下: Android在开机时自动启动一个应用程序 在启动时自动启动一个应用程序: 1.AndroidManif ...

  9. android程序开机自启的方法,Android编程实现应用程序开机自启动的方法

    本文实例讲述了Android编程实现应用程序开机自启动的方法.分享给大家供大家参考,具体如下: Android在开机时自动启动一个应用程序 在启动时自动启动一个应用程序: 1.AndroidManif ...

最新文章

  1. 如何禁用Visual Studio 2013的Browser Link功能
  2. asp简单样例(1)
  3. oracle中case when关键字的使用
  4. 电脑卡顿不流畅是什么原因_为什么安卓系统用久了会卡,苹果系统却依然流畅?原因找到了!...
  5. ASP.NET Core on K8S深入学习(2)部署过程解析与部署Dashboard
  6. dnf加物理攻击的卡片有哪些_DNF:节日宝珠之外百分比神器附魔,拍卖行100w,实用不氪金...
  7. python rtftotxt_利用python将docx文件转为txt
  8. Andrew Ng 的 Machine Learning 课程学习 (week4) Multi-class Classification and Neural Networks
  9. 玩生死狙击找不到服务器怎么办,生死狙击手游进不了游戏解决方法 生死狙击手游进游戏诀窍...
  10. jupyter调用py文件_解决Jupyter notebook中.py与.ipynb文件的import问题
  11. 找不到或是无法加载主类 不是原创
  12. 940mx黑苹果驱动_黑苹果 Clover 驱动配置文件分享
  13. Matlab信道容量的迭代计算实验
  14. 2020 年第一届辽宁省大学生程序设计竞赛
  15. 机器学习:逻辑回归(OvR 与 OvO)
  16. 主板没有rgb接口怎么接灯_想拥有RGB灯效,不懂这些怎么行!
  17. 小孩近视用白炽灯好吗?使用护眼台灯有啥好处?
  18. 通过全局钩子发送自定义消息,实现进程通信
  19. 嵌入式开发要学什么_必备嵌入式学习路线_高手速成方法
  20. 【老王的脑科学谬论】为什么盲人的听觉“似乎”比正常人更“灵敏”?

热门文章

  1. vins中imu融合_视觉和imu融合的算法研究
  2. mysql批量查询并替换或者更新某个字段
  3. python连接impala_python连接impala(安装impyla)
  4. 写一个sql实现以下查询结果_SQL复杂查询—知识点梳理(四)
  5. C++工作笔记-对友元函数的进一步理解
  6. Python笔记-使用代理切换ip爬取数据
  7. Python笔记-requests获取web数据及下载文件
  8. 前端工作笔记-element ui弹窗嵌套并获取输入
  9. C++笔记-构造内存泄漏检测类的基本思路
  10. Spring Boot关于thymeleaf公共页面抽取