| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发工具 -> 关于Dll -> 正文阅读 |
|
[开发工具]关于Dll |
Dll(动态链接库)的加载分为2种:
首先来看一个Dll的例子: ? ?上面3张图分别是main.cpp, Test.h以及Test.cpp。其编译连接后生成了一个名为Sample.dll以及对应的Sample.lib导入库。 静态加载是通过如下几种方式使用: 首先可以通过#pragma comment语句来静态使用dll ?或者可以通过在项目属性中的附加依赖项添加对应的导入库来静态使用 ?这种情况下就无需#pragma comment语句了 最后一种方法是更加直接, 直接把对应的lib添加到工程内部即可, 这样既无需#pragma comment语句也不需要在属性内添加导入库路径 可以看到这3种方法最重要的点在于让VS能够找到导入库的位置。 上述静态加载dll的三种方法都需要导入库(*.lib)参与,实际上还是比较麻烦的,而动态加载dll则没有这种要求 动态加载是通过LoadLibrary和GetProcAddress来实现的 这里不解释如何实现,这里来说一下其中可能会碰到让人感到头疼的问题: 首先来看一下利用动态加载使用dll导出函数的例子: 看上去没有什么问题,但是调试过程中却发现了GetProcAddress获取对应导出函数地址没有成功 ?现在利用Winhex打开sample.dll查看, 发现了Test()导出函数的命名发生了变化 ?将这个新名字作为参数传入GetProcAddress后发现获取对应导出函数地址成功 ?所以之前利用GetProcAddress()来获取Test()函数地址没有成功是由于没有获取正确的函数名称。由于C和C++的编译器都具有对应的名称粉碎机制。即会把对应函数名修改成一种特殊格式(不同编译器的名称粉碎规则都不同, 即使都是C编译器,可能不同公司出产的C编译器名称粉碎规则也不同, 所以无需深究)。 为了解决这个问题,可以将dll的导出函数声明前添加一个extern "C",这就告诉了编译器用C语言的方式编译 这样就能利用原导出函数名称成功获取对应地址了 ?看完这个后再来DllMain,其中有4个标志 ?分别解释下
DllMain的返回值是布尔类型。一般都是返回TRUE。假设说返回FALSE会怎么样?
?注意这种返回FALSE导致的问题只有在DLL_PROCESS_ATTACH选项被触发时才会出现,其他3种选项返回FALSE会被忽略。 (完) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 6:28:28- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |