Dll动态链接库创建与隐式链接方式使用

2023-05-16

C++动态链接库的背景:

    windows操作系统诞生以来,dll就作为win操作系统的基础,通常情况下dll不能直接运行,也无法接收消息,只能供其他可执行程序或者dll来调用,完成某项功能,他的函数只有被调用才会发挥作用,Windows中有三个重要的dll,他们分别是Kernal32.dll,User32.dll,GDI32.dll。

作用:

   隐藏实现细节,再提供给三方客户端使用,便于保护私密信息。

    提供二次开发等。

创建方式:

    1、宏定义的方式声明方法名

     2、使用模块定义文件定义导出函数的方式

查看:

    visual studio安装之后,会自带“vs 2017开发人员命令提示符终端,里面可以直接运行dumpbin命令。另一种办法是进入visual studio安装

目录下的一个工具目录,如我的安装在:D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\bin

\Hostx64\x64。进入该目录,就可以使用dumpbin命令了。

方法名问题:

     默认如果不做任何处理,生成的动态链接库可以导出函数,但是函数名会出现特殊字符。并不是我们在源文件中定义的方法名,因此需要对函数声明做一些处理。还有一种方法就是通过模块定义文件的方式生成dll,这样方法名就不存在改变的问题了。

使用方式:

       隐式链接和动态加载

介绍第一种方式创建动态链接库并使用隐式链接的方式使用dll。

1、创建dll工程。

2、编写头文件。


#ifdef DLL_API1
#else
#define DLL_API1 extern "C" _declspec(dllimport)
#endif
DLL_API1 int add(int a, int b);
DLL_API1 int substract(int a, int b);  

3、编写源文件。


#include "stdafx.h"
#define DLL_API1 extern "C"  _declspec(dllexport)
#include "dll2.h"

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

int substract(int a, int b) {
	return a - b;
}  

4、生成。右键项目名->生成。我这里设置活动解决方案配置的是Release,活动解决方案平台采用的是x64。


1>------ 已启动生成: 项目: Dll2, 配置: Release x64 ------
1>stdafx.cpp
1>Dll2.cpp
1>dllmain.cpp
1>  正在创建库 D:\feiy\workspace\vs\tutorials3\x64\Release\Dll2.lib 和对象 D:\feiy\workspace\vs\tutorials3\x64\Release\Dll2.exp
1>正在生成代码
1>All 3 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
1>已完成代码的生成
1>Dll2.vcxproj -> D:\feiy\workspace\vs\tutorials3\x64\Release\Dll2.dll
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========  

5、通过dumpbin查看生成的dll。dumpbin是visual studio提供的一个可以查看动态链接库导入导出信息。这里不做详细介绍。

启动->所有程序->Visual Sdudio 2017->Visual Studio Tools->VS 2017的开发人员命令提示符,输入dumpbin -export path/to/xxx.dll


D:\Program Files (x86)\Microsoft Visual Studio\2017\Community>dumpbin -exports D
:\feiy\workspace\vs\tutorials3\x64\Release\Dll2.dll
Microsoft (R) COFF/PE Dumper Version 14.13.26129.0
Copyright (C) Microsoft Corporation.  All rights reserved.



Dump of file D:\feiy\workspace\vs\tutorials3\x64\Release\Dll2.dll

File Type: DLL

  Section contains the following exports for Dll2.dll

    00000000 characteristics
    FFFFFFFF time date stamp
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

          1    0 00001000 add = add
          2    1 00001010 substract = substract

  Summary

        1000 .data
        1000 .pdata
        1000 .rdata
        1000 .reloc
        1000 .rsrc
        1000 .text  

从输出内容看,dll导出了我们定义的两个函数add,substract,验证了动态链接库创建成功。接下来就是通过程序来调用动态链接库了。

7、新建console工程,加入dll,lib文件到项目中。

这里需要将Dll2.dll,Dll2.lib文件都拷贝到项目路径下。还需要在资源文件上执行右键->添加->现有项,找到Dll2.lib文件导入。

8、编写测试源文件,并运行。我这里是在一个解决方案下的多个项目,所以没有直接将头文件dll2.h放入当前项目中,而是直接根据路径引入Dll2项目下的dll2.h头文件。


#include <iostream>
#include "../Dll2/dll2.h"
using namespace std;

int main() {
	int sum = add(5, 2);
	cout << "add(5,2)= " << sum << endl;
	int sub = substract(5, 2);
	cout << "substract(5,2): " << sub << endl;
	return 0;
}  

运行结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dll动态链接库创建与隐式链接方式使用 的相关文章

  • Your password does not satisfy the current policy requirements解决办法

    mysql5 7 x安装以后 xff0c 想修改随机生成的密码为简单容易记忆的密码 xff0c 如root 123456等 xff0c 这时候通过修改密码的几种方式都不行 xff0c 出现密码不符合当前安全策略要求 为了解决这种问题 xff
  • redhat7安装oracle11gR2之环境准备

    redhat7安装oracle11gR2环境准备 xff1a 内存 xff1a 2g 磁盘空间 xff1a 15g以上 交换分区 xff1a 3g 我们将oracle安装到 opt app oracle目录下 xff0c 后面的环境变量则以
  • redhat7安装oracle11gR2之动手安装

    oracle11gR2 64位数据库下载地址 xff1a http www oracle com technetwork database enterprise edition downloads 112010 linx8664soft 1
  • redhat7静默安装oracle11gR2

    所谓的静默安装是指不用安装redhat7桌面系统 xff0c 并进入桌面利用界面安装oracle xff0c 这里采用最小化安装redhat7 xff0c 直接在命令行下通过命令执行安装 环境配置和用户设置基本和界面安装一致 就是进入 op
  • docker+nextcloud搭建个人云存储系统

    一 docker安装和启动 yum install epel release yum install docker service docker start 二 docker compose安装 curl L http github com
  • kafka集群搭建以及运行kafka监控平台kmonitor

    kafka集群搭建 kafka依赖zookeeper运行 xff0c 在搭建kafka系统之前需要搭建zookeeper集群 xff0c 这里先略过zookeeper集群搭建的过程 另外 xff0c kafka需要运行在jdk环境中 xff
  • CDH5安装失败如何重新安装

    cdh安装失败的原因可能有以下原因 xff1a 1 机器内存不足 xff0c server节点我用了6G xff0c 两个agent节点均是4G才安装成功 2 需要的mysql驱动文件没有拷贝到指定位置 具体重新安装步骤如下 xff1a 一
  • nginx日志切割和日志定期清理

    nginx日志默认不做人为处理 xff0c 日志文件会存放在access log error log两个文件中 xff0c 随着时间的推移 xff0c 日志量会越来越大 xff0c 不方便编辑查看 xff0c 为了让日志按天存放 xff0c
  • 结构体(参数、嵌套)、结构体指针、结构体中const的使用场景

    结构体 xff1a 属于用户自定义的数据类型 xff0c 允许用户存储不同的数据类型 xff1b 结构体定义和使用 通过结构体创建变量的方式有三种 xff1a struct 结构体名 变量名struct 结构体名 变量名 61 成员1 xf
  • CentOS7.3安装mesos1.4.0

    按照官网一步一步安装mesos 这里选择的版本是1 4 0 download mesos wget http archive apache org dist mesos 1 4 0 mesos 1 4 0 tar gz tar xzf me
  • redhat7上rpm方式安装mongodb

    1 下载相关文件 xff0c 下载地址 xff1a http mirrors aliyun com mongodb yum redhat 7 mongodb org stable x86 64 RPMS mongodb org 3 2 9
  • mongodb集群搭建之Replica-Set方式

    mongodb集群搭建有三种方式 1 Master Slave模式 2 Replica Set方式 3 Sharding方式 其中 xff0c 第一种方式基本没什么意义 xff0c 官方也不推荐这种方式搭建 另外两种分别就是副本集和分片的方
  • solr5.5.5入门实例

    solr是apache开源的搜索引擎 xff0c 底层基于lucene 将lucene难以使用的api 通过封装 xff0c 为用户提供方便的接口 solr国内下载地址 xff1a https mirrors cnnic cn apache
  • redis4.0.2版本集群搭建

    redhat7下redis源码编译安装 xff0c 需要先安装pcre openssl等依赖 yum install openssl devel pcre devel 然后下载redis 4 0 2 tar gz xff0c 解压 xff0
  • Redis-Cluster操作详解

    redis在2 8版本中支持分布式的部署 xff0c 但不是真正意义上的集群 xff0c 单独操作一台主机获取相应key 如果这个key没有落在该机器上 xff0c 那么就获取不到 只有分片在该机器上才能获取到 redis从3 0版本开始支
  • flink快速入门及采坑记录

    apache flink作为第四代mapreduce计算框架 xff0c 已经得到越来越多的应用 xff0c 这里介绍如何快速入门 xff0c 以及记录一个内存错误的问题 1 安装jdk 2 下载flink 并解压 wget https m
  • 没有为扩展名.py找到关联文件解决办法

    如题 xff0c 在win7上安装python3 5之后 xff0c 通过pip install awscli命令行 xff0c 最后执行aws命令时总是先提示一句 34 没有为扩展名 py找到关联文件 34 xff0c 然后显示执行结果
  • No configuration found for this host:tier1

    flume启动时 xff0c 如果没有通过参数 name 或者 n 指定代理 xff0c 那么默认使用tier1作为代理名称 xff0c 启动成功后 xff0c 不会报错 xff0c 但是可能会提示如题警告 flume conf配置文件默认
  • linux下通过pip安装最新uwsgi

    通过yum install uwsgi 安装的uwsgi在进行测试的时候 xff0c 发现版本是2 0 15 但是启动uwsgi测试的时候报参数错误 xff0c 后来改用pip安装 先yum remove uwsgi删除老的uwsgi 就成
  • 将原有python复制到anaconda虚拟环境后,可以激活但是不显示的问题

    第一步参考 如何在已安装Python条件下 xff0c 安装Anaconda xff0c 并将原有Python添加到Anaconda中 amazingym 博客园 发现conda info e 不显示环境 xff0c 但是用文件夹名称可以顺

随机推荐

  • pip更改国内源

    默认情况下 xff0c pip安装一个工具 xff0c 是通过使用官方的源 https pypi python org simple xff0c 速度上是一个很大的问题 xff0c 例如 xff0c 安装tensorflow 默认第一个下载
  • win7+vmware12+mac10.10安装过程

    win7 43 vmware12安装mac10 11 10 12 10 13均失败 xff0c 最终安装mac10 10成功 xff0c 不知道是不是硬件不支持 这里记录一下mac10 10虚拟机安装的过程 默认情况下 xff0c vmwa
  • mac虚拟机安装之后需要做这些

    一 让mac使用体验更好 mac虚拟机安装完成之后 xff0c 需要让系统用起来顺畅 xff0c 鼠标滑动平稳 xff0c 需要安装vmware tools工具 这里需要下载vmwaretools镜像 我这里名字叫 VMware 43 To
  • mac系统pip安装package路径问题

    默认情况下 xff0c 通过pip安装会提示Permission Denied 这时候通过sudo pip install xxx可以安装 xff0c 但是安装的路径不是系统默认的路径 xff0c 再次通过pip list列出已经安装过的工
  • xcrun: error: invalid active developer path解决办法

    mac下如果安装过xcode 之后又卸载 xff0c 再使用git等命令时就提示错误 invalid active path Applications Xcode app Contents Developer 一般情况可以通过xcode s
  • Hue安装与配置

    Hue是cloudera提供的hadoop ui 利用它可以很直观的操作和查看hadoop生态应用 一般安装cloudera manager之后会自动带有hue管理界面 xff0c 通过http hueserver 8888即可访问 另外
  • aapt查看apk应用信息

    aapt是Android asset package tools 利用aapt命令可以很方便的查看app包信息 linux下安装配置aapt 先下载aapt 然后放入 usr bin目录 xff0c 并改变权限为可执行文件 aapt帮助 以
  • Git-TortoiseGit使用报错:cannot spawn xxx\bin\ssh.exe: No such file or directory fatal

    一般开发都是用eclipse自带的git插件提交代码 xff0c 今天试了一把TortoiseGit的提交 结果报错 查看TortoiseGit gt Settings xff1a 发现这里环境变量和设置的环境变量不一致 xff0c 猜测是
  • windows+spark本地运行环境搭建

    spark作为一个内存mapreduce框架 xff0c 速度是hadoop的10倍甚至100倍 windows下可以通过简单设置 xff0c 搭建本地运行环境 1 下载spark预编译版本 xff0c spark运行环境依赖jdk sca
  • git clone 报错:Peer reports incompatible or unsupported protocol version解决办法

    git通过git clone下载github上的资源到机器上 xff0c 结果出现如题所示的错误 root 64 server data git clone https github com pingcap tidb docker comp
  • explian使用介绍

    1 xff09 id列数字越大越先执行 xff0c 如果说数字一样大 xff0c 那么就从上往下依次执行 xff0c id列为null的就表是这是一个结果集 xff0c 不需要使用它来进行查询 2 xff09 select type列常见的
  • centos7安装rustup

    rust安装 xff0c 因为被墙的原因 xff0c 在国内几乎很难安装 xff0c 需要通过代理安装 但是rustup却很容易 xff0c 一般在linux下 xff0c 通过官方指定的下列语句 xff0c 基本可以安装rustup cu
  • TiDB在Centos7上通过源码编译安装

    这里难以编译安装的是tikv tidb的三大部分tidb pd tikv中tidb pd均是采用go语言编写 xff0c 安装go语言包即可编译 xff0c 唯独tikv是采用rust语言写的 xff0c 他的编译是最复杂的 而且编译环境非
  • Cloudera Manager 5.12.0图文详解安装过程

    这里介绍的是cdh5的离线安装方式 xff0c 需要的文件提前准备好 xff0c 安装过程会快一些 安装前提 xff1a 机器配置内存一定要高 xff0c 我这里安装的虚拟机均是redhat7 xff1a 内存分别是6G 4G 4G 准备的
  • Failed to get D-Bus connection: Operation not permitted

    docker容器centos7中 xff0c 通过systemctl start service出现下错误 Failed to get D Bus connection Operation not permitted docker中的容器启
  • C++中如何求数组长度

    C 43 43 中没有直接提供求数组长度的方法 xff0c 提供了sizeof begin end 等方法 xff0c 可以供求数组长度使用 可以通过两种方式来求数组长度 xff0c 这里使用模版类 一个是使用sizeof 做除法 xff0
  • IDEA+scala插件开发spark程序

    spark由scala语言编写 xff0c 开发spark程序 xff0c 自然也少不了scala环境 xff0c 这里介绍如何利用Intellij IDEA开发spark 1 环境准备 jdk scala idea这些对于本文来说都已经默
  • hadoop-3.0.1源码编译需要注意的事项

    这次尝试了一下源码编译最新的hadoop3 0 1 xff0c 发现了几个和原来不太一样的地方 记录下来 xff1a 1 需要的jdk不再是原来的1 7 xff0c 直接jdk1 8就编译通过了 xff1b 2 以前安装需要安装编译依赖cm
  • hadoop-3.0.1单节点安装部署

    hadoop 3 0 1编译上和原来有不同的地方 xff0c 部署时 xff0c 也有一些需要注意的地方 安装部署过程一笔带过 xff1a a 设置免秘钥登录 b 设置jdk环境变量 c 配置编译好的hadoop环境变量 xff0c HAD
  • Dll动态链接库创建与隐式链接方式使用

    C 43 43 动态链接库的背景 xff1a windows操作系统诞生以来 xff0c dll就作为win操作系统的基础 xff0c 通常情况下dll不能直接运行 xff0c 也无法接收消息 xff0c 只能供其他可执行程序或者dll来调