码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Windows动态链接库使用详解


    目录

    概念

    生成dll文件

    导出函数

    使用方法


    概念

    C++共享函数库有两种方式,动态库和静态库,动态链接库提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。

    生成dll文件

    使用vs创建dll动态链接库项目,vs自动生成代码解析如下图。


    导出函数

    当我们需要给使用dll库的开发者提供可调用函数时,我们需要将自己编写的功能函数进行导出,在vs下导出的方式有很多,最常用的方法是在需要导出的函数前加 关键字 _declspec(dllexport) ,为了兼容性一般 以 extern "C" 的方式导出,示例如下。

    1. // dllmain.cpp : 定义 DLL 应用程序的入口点。
    2. #include "pch.h"
    3. //dll入口函数
    4. BOOL APIENTRY DllMain( HMODULE hModule,//指向dll本身的实例句柄
    5. DWORD ul_reason_for_call,//dll被调用的原因
    6. LPVOID lpReserved//保留参数
    7. )
    8. {
    9. switch (ul_reason_for_call)
    10. {
    11. case DLL_PROCESS_ATTACH: //dll第一次被调用时,即当dll刚被注入时就会启动
    12. case DLL_THREAD_ATTACH://进程创建一线程时
    13. case DLL_THREAD_DETACH://线程调用了ExitThread来结束线程时
    14. case DLL_PROCESS_DETACH://dll被从进程的地址空间解除映射时
    15. break;
    16. }
    17. return TRUE;
    18. }
    19. extern "C" _declspec(dllexport) void showWindow()
    20. {
    21. MessageBoxA(NULL, "hello,I am dll", "dll", MB_OK);
    22. }

    使用方法

    首先使用 LoadLibraryA 加载dll模块,函数只有一个参数:模块的名称。这可以是库模块(.dll文件)或可执行模块(.exe文件)。然后调用GetProcAddress(),获取模块中函数的地址,一般使用函数指针来接受其返回值。

    GetProcAddress函数原型

    FARPROC GetProcAddress(
      [in] HMODULE hModule,
      [in] LPCSTR  lpProcName
    );

    [in] hModule

    包含函数或变量的 DLL 模块的句柄。LoadLibrary、LoadLibraryEx、LoadPackagedLibrary 或 GetModuleHandle 函数返回此句柄。

    [in] lpProcName

    函数或变量名称,或函数的序号值。如果此参数是序数值,则必须在低阶字中;高阶字必须为零。

    示例代码

    1. #include<windows.h>
    2. typedef void (*Func)(void);
    3. int main()
    4. {
    5. HMODULE mod=LoadLibraryA("Dll1.dll");
    6. Func fp = (Func)GetProcAddress(mod, "showWindow");
    7. fp();
    8. return 0;
    9. }

    运行截图

  • 相关阅读:
    23年宁波职教中心CTF竞赛-决赛
    数据结构-二叉排序树(建立、查找、修改)
    中学数学教学参考杂志社中学数学教学参考编辑部2022年第27期目录
    对于html和css初学者,你有什么值得推荐的简单的网页适合练习?
    根据关键词取商品列表 API 返回值说明
    【特征选择】基于教与学算法实现二进制特征选择问题附matlab代码
    HAProxy的详解和使用
    Python如何远程连接设置密码的MongoDB库
    NIO知识总结二
    自动化测试 selenium+Junit 总结知识
  • 原文地址:https://blog.csdn.net/weixin_40582034/article/details/125614198
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号