动态链接库 仅有.dll文件时候的使用方法

在没有.h和.lib文件时,需要函数指针和WIN32 API函数 LoadLibrary, GetProcAddress 和FreeLibrary

只需要.dll文件即可(将.dll文件置入工程目录中)。

LoadLibrary

进程调用 LoadLibrary以显式链接到 DLL。 如果函数执行成功,它会将指定的 DLL 映射到调用进程的地址空间中并返回该 DLL 的句柄。

此句柄可以与其他函数(如 GetProcAddress 和FreeLibrary)一起在显式链接中使用。

LoadLibrary 将尝试使用用于隐式链接的相同搜索序列来查找 DLL。 如果系统无法找到所需的 DLL 或者入口点函数返回 FALSE,

则 LoadLibrary 将返回 NULL。 如果对 LoadLibrary 的调用所指定的 DLL 模块已映射到调用进程的地址空间中,

则该函数将返回该 DLL 的句柄并递增模块的引用数。

如果 DLL 具有入口点函数,则操作系统将在调用 LoadLibrary 的线程的上下文中调用此函数。 

如果由于以前调用了 LoadLibrary,但没有相应地调用 FreeLibrary 函数,从而导致已经将 DLL 附加到进程,则不会调用此入口点函数。

如果 Windows 无法加载 DLL,则进程会尝试从错误中恢复。 例如,进程会通知用户所发生的错误,并要求用户指定 DLL 的其他路径。

 

GetProcAddress

显式链接到 DLL 的进程调用 GetProcAddress 来获取 DLL 导出函数的地址。 

使用返回的函数指针调用 DLL 函数。 

GetProcAddress 将(由 LoadLibrary或 GetModuleHandle 返回的)DLL 模块句柄和要调用的函数名或函数的导出序号用作参数。

由于是通过指针调用 DLL 函数并且没有编译时类型检查,需确保函数的参数是正确的,以便不会超出在堆栈上分配的内存和不会导致访问冲突。 

帮助提供类型安全的一种方法是查看导出函数的函数原型,并创建函数指针的匹配 typedef。

FreeLibrary

处理链接到 DLL 的显式调用函数,FreeLibrary 当不再需要 DLL 模块。 此函数递减模块的引用数,如果引用数为零,此函数便从进程的地址空间中取消模块的映射。

 

#include <iostream>
#include <windows.h>               //使用函数和某些特殊变量
typedef void (*DLLFunc)(int,int);  //确定调用函数的形参
int main()
{DLLFunc dllFunc;HINSTANCE hInstLibrary = LoadLibrary("sub.dll");//加载.dllif (hInstLibrary == NULL){FreeLibrary(hInstLibrary);}dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "sub");//第二个参数为要调用的函数名称if (dllFunc == NULL){FreeLibrary(hInstLibrary);}dllFunc(5,4);FreeLibrary(hInstLibrary);return(1);
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跟vczh看实例学编译原理——一:Tinymoe的设计哲学

自从《序》胡扯了快一个月之后&#xff0c;终于迎来了正片。之所以系列文章叫《看实例学编译原理》&#xff0c;是因为整个系列会通过带大家一步一步实现Tinymoe的过程&#xff0c;来介绍编译原理的一些知识点。 但是第一个系列还没到开始处理Tinymoe源代码的时候&#xff0c;首…

Linux蜂鸣器实验(使用上一节子系统思想,摈弃了自己配置寄存器的繁琐操作)

目录子系统思想的蜂鸣器驱动流程硬件原理图分析实验程序编写修改设备树文件蜂鸣器驱动程序编写编写测试APP运行测试编译驱动程序和测试APP运行测试上一章实验中我们借助pinctrl 和gpio 子系统编写了LED 灯驱动&#xff0c;I.MX6U-ALPHA 开发板上还有一个蜂鸣器&#xff0c;从软…

gitbash如何修改可恶的蓝色字体

1、问题 这完全看不清啊&#xff01;&#xff01; 2、环境 git version 2.19.0 3、解决 1&#xff09;编辑/etc/bash.bashrc # Uncomment to use the terminal colours set in DIR_COLORS eval "$(dircolors -b /etc/DIR_COLORS)" 2&#xff09;编辑/etc/DIR…

Oracle分析函数

2019独角兽企业重金招聘Python工程师标准>>> Oracle分析函数——函数列表 SUM &#xff1a;该函数计算组中表达式的累积和 MIN &#xff1a;在一个组中的数据窗口中查找表达式的最小值 MAX &#xff1a;在一个组中的数据窗口中查找表达式的…

Linux并发与竞争介绍(原子操作、自旋锁、信号量、互斥体)

目录并发与竞争并发与竞争简介保护内容是什么原子操作原子操作简介原子整形操作API函数(atomic_t 结构体)原子位操作API 函数自旋锁自旋锁简介自旋锁API函数线程与线程线程与中断(获取锁之前关闭中断)其他类型的锁(读写锁、顺序锁)自旋锁使用注意事项信号量信号量简介信号量API…

新后缀再开放,投资者应谨慎对待!

为什么80%的码农都做不了架构师&#xff1f;>>> 新后缀再开放&#xff0c;投资者应谨慎对待&#xff01;2014年伊始&#xff0c;一大批如BIKE&#xff0c;GURU&#xff0c;HOLDINGS等新域名后缀正式启用&#xff0c;是继CNNIC开放CN保留域名注册之后&#xff0c;投…

Linux并发与竞争实验(一次只允许一个应用程序操作LED灯)

目录原子操作实验实验程序编写运行测试(运行多个APP抢占资源)自旋锁实验实验程序编写运行测试信号量实验实验程序编写运行测试(第二条命令因为获取信号量失败而进入休眠状态)互斥体实验(类似二值信号量&#xff0c;会休眠)实验程序编写运行测试在上一章中我们学习了Linux 下的并…

drf缓存

全站缓存: 两个中间件: MIDDLEWARE_CLASSES ( ‘django.middleware.cache.UpdateCacheMiddleware’, #第一 django.middleware.common.CommonMiddleware, ‘django.middleware.cache.FetchFromCacheMiddleware’, #最后 ) CACHE_MIDDLEWARE_SECONDS10 单页面缓存:…

在 SharePoint 2013 中选择正确的 API 集

决定使用哪个 API 集的因素 您可以在多个 API 集中选择一个来访问 SharePoint 2013 平台。您使用哪一个 API 集取决于以下因素&#xff1a; 应用程序的类型。 可能的类型包括但不限于以下不相互排斥的类别&#xff1a;SharePoint 相关应用程序、SharePoint 页上的 Web 部件、在…

Linux按键输入实验(体验一下输入驱动,实际开发使用input子系统处理)

目录Linux下按键驱动原理(使用原子操作)硬件原理图分析实验程序编写修改设备树文件按键驱动程序编写编写测试APP(循环读取按键值)运行测试编译驱动程序和测试APP运行测试(while循环导致CPU占用率很高&#xff0c;后面使用阻塞非阻塞IO处理)在前几章我们都是使用的GPIO 输出功能…

SAP Fiori + Vue = ?

2017年3月28日&#xff0c;我到国内一个SAP CRM客户那里&#xff0c;同他们的架构师关于二次开发的UI框架选择SAP UI5还是Vue进行了一番探讨。回到SAP研究院之后&#xff0c;我把这个问题扔到了公司的微信群里&#xff0c;引起了大家的热烈讨论。 因为出差回来之后&#xff0c;…

linux内核书籍

linux内核书籍 1, 关于操作系统理论的最初级的知识。不需要通读并理解《操作系统概念》《现代操作系统》等巨著&#xff0c;但总要知道分时&#xff08;time-shared&#xff09;和实时&#xff08;real-time&#xff09;的区别是什么&#xff0c;进程是个什么东西&#xff0c;C…

Linux 内核定时器实验————复习到这

目录Linux 时间管理和内核定时器简介内核时间管理简介内核定时器简介Linux 内核短延时函数硬件原理图分析实验程序编写修改设备树文件定时器驱动程序编写编写测试APP运行测试编译驱动程序和测试APP运行测试定时器是我们最常用到的功能&#xff0c;一般用来完成定时功能&#xf…

商品评价判别,文本分类——学习笔记

FASTTEXT&#xff08;Facebook开源技术&#xff09; 二分类任务&#xff0c;监督学习。 自然语言 NLP自然语言处理 步骤&#xff1a; 语料Corpus&#xff1a;好评和差评分词Words Segmentation&#xff1a;基于HMM构建dict tree 构建词向量Construct Vector&#xff1a; one-ho…

跨平台(Android, iOS, WP, HTML5)游戏开发libGDX学习教程

2019独角兽企业重金招聘Python工程师标准>>> 疯狂小土豆的跨平台游戏开发引擎libGDX游戏开发视频&#xff0c;本视频主讲Android和桌面游戏开发。libGdx是一个跨平台的2D/3D的游戏开发框 架&#xff0c;它由Java/C/C语言编写而成。它基于Apache License, Version 2.…

分页器 版本控制

分页器 三种分页: 第一种: 类似于原来django中的分页 -page_size api_settings.PAGE_SIZE -page_query_param page -page_size_query_param -max_page_size 第二种:偏移分页 #每页显示的条数 default_limit api_settings.PAGE_SIZE #标杆值 offset_query_param offset #往后…

Linux 中断实验

目录Linux 中断简介Linux 中断API 函数上半部与下半部设备树中断信息节点获取中断号硬件原理图分析实验程序编写修改设备树文件按键中断驱动程序编写编写测试APP运行测试编译驱动程序和测试APP运行测试不管是裸机实验还是Linux 下的驱动实验&#xff0c;中断都是频繁使用的功能…

如何为libs目录下的jar包关联源代码

以前&#xff0c;我们可以为lib目录下的jar包关联源代码&#xff0c;但是现在似乎不行了。 下面是一篇讲述此问题解决方法的文章&#xff1a; How to attach javadoc or sources to jars in libs folder? 下面是google论坛对此问题的一篇讨论&#xff1a; https://code.google…

UDLD(Unidirectional Link Detection)

1、UDLD&#xff08;单向链路检测协议&#xff09;工作原理 为了在生成转发环路之前检测到单向链路&#xff0c;Cisco 设计并实施了 UDLD 协议。UDLD 是与第 1 层 (L1) 机制一起工作以确定链路物理状态的第 2 层 (L2) 协议。 在第 1 层中&#xff0c;自动协商…

小议map排序问题

map有序无序&#xff1f;如果说有序&#xff0c; 这个顺序是怎么定义的&#xff1f; 安装put的先后顺序吗&#xff1f; 还是被put元素的内容呢&#xff1f; 经观察&#xff0c;应该是后者&#xff0c;跟put先后顺序无关&#xff0c; 跟内部实现有关&#xff08;可能是hash排序的…