def模块定义方式创建动态链接库与动态加载使用dll

2023-05-16

前面介绍了通过宏定义_declspec(dllexport)的方式创建动态链接库,需要定义头文件和宏,定义函数时需要使用宏定义,这种方式过于繁琐,这里介绍使用模块定义文件的方式创建动态链接库,只需要一个源文件和一个def文件即可,代码非常简单,通过动态加载的方式使用dll也非常简单,只需要将动态链接库放入项目路径下即可。

1、创建动态链接库工程,并手工新建文件Dll1.def,定义需要导出的方法名和动态链接库名。

Dll1.def文件内容如下:


LIBRARY Dll1

EXPORTS
add
substract
printHello  

这里我们增加了printHello方法,调用c++的输出,向控制台打印Hello,JNA。

2、创建源文件,并编码。


#include "stdafx.h"
#include <iostream>
using namespace std;
int add(int a, int b) {
	return a + b;
}
int substract(int a, int b) {
	return a - b;
}
void printHello() {
	cout << "Hello,JNA" << endl;
}  

3、这里需要设置一下,将Dll1.def文件和项目关联起来。执行项目右键->属性->链接器->输入->右侧模块定义文件->选择项目中的Dll1.def文件。如下图:

4、生成,这里如果不将模块定义文件指定到项目中,生成时不会报错,但是生成的dll文件中不会导出我们需要给客户端使用的函数,违背了我们的初衷。

5、dumpbin查看Dll1.dll文件,验证导出函数。

结果证明,导出函数成功,并且方法名没有发生变化。

6、通过动态加载的方式使用动态链接库。还是创建控制台空项目。并将Dll1.dll文件加入项目路径下。然后新建源文件,编码。

这里使用动态加载的方式,就需要手动编写获取dll导出函数的方法,并调用。


#include <iostream>
#include "Windows.h"
using namespace std;

int main() {
	HMODULE hDll;
	hDll = LoadLibrary(L"Dll1.dll");
	typedef int(*FUNCTION)(int a, int b);
	FUNCTION ADD = (FUNCTION)GetProcAddress(hDll, "add");
	FUNCTION SUB = (FUNCTION)GetProcAddress(hDll, "substract");
	if (!ADD) {
		cout << "获取地址失败" << endl;
		return 0;
	}
	cout << "dynamic load add(5,2)=" << ADD(5, 2) << endl;
	cout << "dynamic load substract(5,2)=" << SUB(5, 2) << endl;
	return 0;
}  

与静态链接的方式使用dll相比,动态加载的方式,不用将lib文件也加入到项目中,只需要将dll文件拷贝到项目路径下,然后编写调用过程时,因为是动态加载,所以每次使用的时候,必须通过获取函数地址的方式来获取函数名,最终调用函数。

运行结果如下:

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

def模块定义方式创建动态链接库与动态加载使用dll 的相关文章

  • 请求的 dll 执行级别

    我正在开发一个 WinForms 应用程序 Vista Win7 中有一小部分功能需要以管理员身份运行 我了解如何在清单中设置应用程序的requestedExecutionLevel 诀窍是 我不想要求用户以管理员身份运行整个应用程序 而只
  • ws2_32.lib 与 libws2_32.a,有什么区别以及如何将 libws2_32 链接到 NB 项目?

    我使用 NetBeans Windows 和 Cygwin 以及 g 编译器 我正在研究 Windows Sockets 2 我所做的一切都是用 MS 编写的manual http msdn microsoft com en us libr
  • 获取DLL函数的内存地址

    我想知道是否有可能 使用 C 和 WindowsAPI 是否有一个函数可以让我获得 dll 中函数的 32 位 我认为 内存地址 例如 如何获取 kernel32 dll 中 Beep 的 32 位 xxxxxxxx 地址 其次 如果我在汇
  • 如何在 Tridion 中获取当前登录用户的 tcmid?

    private void Subscribe EventSystem Subscribe
  • 如何制作包含DLL文件的JAR文件?

    我购买了一个第三方Java库 其中包括一个JAR文件和两个DLL文件 我编写了自己的 Java 程序来调用第三方 JAR 文件 现在我的问题是如何将我的所有代码打包到一个 JAR 文件中 其中包含我的所有代码以及第三方 JAR 和 DLL
  • 如何使用 DLL 来模拟静态库的“应用程序内全局变量的多个实例”行为?

    我们有一个用 C C 编写的应用程序 它被分解为单个 EXE 和多个 DLL 这些 DLL 中的每一个都使用相同的静态库 utilities lib 实用程序静态库中的任何全局变量实际上在应用程序内运行时都会有多个实例 每个模块 即 DLL
  • C# 无法加载 DLL(找不到模块 HRESULT:0x8007007E)

    错误 无法加载 DLL x dll 找不到指定的模块 HRESULT 异常 0x8007007E 操作系统 Windows 7 我有两个站 Visual Studio 2012 使用 net 4 0 另一个没有安装VS 在使用 VS2012
  • 制作 C# 项目 DLL 和 EXE

    我正在开发一个项目 需要有一个可执行文件以便用户可以运行配置界面和一个可以嵌入其他项目以使用其他一些功能的 DLL 有没有办法让 Visual Studio 同时生成可执行文件和 DLL 而不是每次都手动切换 我同意 TJMonk15 的观
  • 使用 GdiPlus 卸载 DLL 时程序挂起

    我有一个加载 DLL 的应用程序 它使用德尔福 GDI 库 http sourceforge net projects delphigdiplus 该应用程序在卸载 DLL 时挂起 调用免费图书馆 https msdn microsoft
  • 如何从 dll 导出 C++ 类? [复制]

    这个问题在这里已经有答案了 我有一个有两个重载函数的类 如何从 dll 导出它以及如何由其他 C 类使用它 我的班级是这样的 define DECLDIREXP declspec dllexport define DECLDIRIMP de
  • C++/CLI 在运行时显式加载托管 DLL(相当于非托管的 LoadLibrary)

    问题一 有没有办法在 C CLI 中在运行时而不是在编译时显式加载库 目前我在编译时使用 NET 添加引用 我想显式加载托管 dll NET 中是否有 LoadLibrary 的等效项 Update 感谢兰多夫 Assembly LoadF
  • Powershell 调用程序集委托

    我有一个用于过程控制应用程序的 dll 程序集 我在我的内部使用 load电源外壳 script 该DLL包含我需要使用的委托类型 委托名称是 X Y Delegate 我在该 DLL 中有另一个方法 应该这样调用 Method deleg
  • 尝试使用适用于 Windows XP 的 Heroku 时未找到 msvcrt-ruby18.dll

    我有一个学生在 Windows XP 上进行开发 他在尝试运行时遇到了一个奇怪的错误heroku keys add 错误是 This application has failed to start because msvcrt ruby18
  • 实体框架、dll、excel

    我用C 编写了Excel使用的dll 该dll是COM注册的 我与 Excel 的连接没有问题 该 dll 使用实体框架 5 从 SQL Server 数据库检索数据 如果我通过控制台应用程序运行该 dll 则该 dll 工作正常 但是当我
  • 防止 Ada DLL 中的名称损坏

    有没有一种简单的方法可以防止在创建 Ada DLL 时 Ada 名称被破坏 这是我的 adb 代码 with Ada Text IO package body testDLL is procedure Print Call is begin
  • 在 matlab 代码中使用 dll 文件

    我需要使用 Matlab 中由 dll 文件定义的函数 我有一个例子 那个家伙将 dll 转换为 mexw32 文件 但我知道我是如何做到这一点的 我尝试使用加载库但它没有创建任何文件 我怎样才能做到这一点 loadlibrary http
  • 资源文件是否编译为 UNICODE 或 ANSI 代码页?

    首先 如果这个问题已经被回答了一百次了 我深表歉意 噢 但我的搜索显然很糟糕 因为我没有运气回答这个基本问题 EXE DLL中的资源是如何存储的 作为 UNICODE UCS 2 Windows 本机内部字符格式 还是使用资源块的代码页作为
  • C# 中 DLL 和命名空间的关系

    这里有一个高级问题 今天我花了很多时间自学基本的高级概念 例如 API 静态和动态库 DLL 以及 C 中的编组 获得所有这些知识让我想到了一个看起来非常基本的问题 并且可能表明我对这些概念的理解存在漏洞 我知道的 DLL 可能包含类 这些
  • 在 Visual Studio C++ 2008 中包含 dll

    有没有办法将 dll 包含在项目中 这样我就不必在编译后将这些 dll 与可执行文件放在同一文件夹中 这样我就可以用它们编译我的项目 这是否有可能 如果是 有人可以指导我 我的项目是一个 opencv 项目 有很多 dll 我必须包含在文件
  • 通过 Excel / VBA 调用 DLL 中的 C++ 函数在传递双参数时生成异常

    我试图通过 DLL 在 Excel VBA 中使用 C C 静态函数 我在 VS17 中调试时遇到异常 我怀疑这是参数传递方式的问题 它是双精度 EXCEL EXE 中 0x00007FFA28BBA14F kernel32 dll 处抛出

随机推荐

  • 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来调
  • def模块定义方式创建动态链接库与动态加载使用dll

    前面介绍了通过宏定义 declspec dllexport 的方式创建动态链接库 xff0c 需要定义头文件和宏 xff0c 定义函数时需要使用宏定义 xff0c 这种方式过于繁琐 xff0c 这里介绍使用模块定义文件的方式创建动态链接库