目录

概念

生成dll文件

导出函数

使用方法


概念

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

生成dll文件

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

导出函数

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

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

使用方法

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

GetProcAddress函数原型

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

[in] hModule

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

[in] lpProcName

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

示例代码

#include<windows.h>typedef void (*Func)(void);int main()
{HMODULE  mod=LoadLibraryA("Dll1.dll");Func fp = (Func)GetProcAddress(mod, "showWindow");fp();return 0;
}

运行截图

Windows动态链接库使用详解相关推荐

  1. Windows API函数大全---附:windows运行命令详解

    1. API之网络函数             WNetAddConnection 创建同一个网络资源的永久性连接             WNetAddConnection2 创建同一个网络资源的连 ...

  2. 技术资料收藏:Windows系统文件中文详解

    技术资料收藏:Windows系统文件中文详解 A ↑ ACCESS.CHM - Windows帮助文件 ACCSTAT.EXE - 辅助状态指示器 ADVAPI32.DLL - 高级Win32应用程序 ...

  3. 《Windows系统文件名详解(上)》

    WINDOWS应用 UNIX|LINUX office软件 其他内容 维修实例 其他 photoshop CorelDraw AutoCAD 其他 程序语言类 数据库类 网站建设 互联网应用 网络安全 ...

  4. Windows权限设置详解

    Windows权限设置详解 随着动网论坛的广泛应用和动网上传漏洞的被发现以及SQL注入式***越来越多的被使用,WEBSHELL让防火墙形同虚设,一台即使打了所有微软补丁.只让80端口对外开放的WEB ...

  5. Windows 纤程详解

    Windows 纤程详解 在Windows2000/XP中,纤程(fiber)相当于用户级别的线程或轻进程.纤程由Win32库函数支持,对核心是不可见的.纤程可以通过SwitchToFiber显示至另 ...

  6. Windows XP服务详解

      Windows XP服务详解 微软的个人操作系统从Win98发展到WinXP,为什么突然变得那么消耗系统资源呢?以至于很多人都感觉WinXP只是高配置的电脑才能运行的操作系统,其实不然.WinXP ...

  7. 优化Windows XP虚拟内存详解(转)

    优化Windows XP虚拟内存详解(转)[@more@] 什么是虚拟内存? 虚拟内存是Windows XP为作为内存使用的一部分硬盘空间.即便物理内存很大,虚拟内存也是必不可少的.虚拟内存在硬盘上其 ...

  8. Windows消息机制详解-5

    一. 什么是消息 在解释什么是消息之前,我们先讨论一下程序的执行机制问题.大体上说,程序按照执行机制可以分为两类: 第一类是过程驱动.比如我们最早接触编程时写的C程序,又或者单片机程序.这类程序往往预 ...

  9. Windows监控——性能指标详解

    性能计数器详解 Windows -Processor 指标名称 指标描述 指标范围 CPU利用率 (% Processor Time) % Processor Time指处理器执行非闲置线程时间的百分 ...

最新文章

  1. 前端神器—Google Chrome Devtools细节详解
  2. easyexcel导入固定sheet_easyexcel指定多个sheet导excel数据
  3. linux登oracle登陆不了,oracle: linux服务器本机不能登陆的解决
  4. Linux 平台 C/C++ 代码中设置线程名
  5. bit不是java基本类型吗_Java bit / byte 基本数据类型
  6. DevOps发布策略简介
  7. java就业培训教程 第一章读书笔记
  8. [转]看懂 Serverless,这一篇就够了
  9. 2017-11-28
  10. 国脉信息学院计算机网络,福建工程学院国脉信息学院《计算机网络模拟题》
  11. Java基础continue语句
  12. java代码混淆,程序加密推荐 java授权 支持JDK16
  13. python进行英语文献翻译
  14. netperf的安装、性能测试、参数、启动报错的坑、实例
  15. Win11蓝屏代码IRQL NOT LESS OR EQUAL的处理方法
  16. 控制面板卸载不了程序,教您如何处理控制面板中卸载不掉的软件
  17. php漂浮,【飘】【漂】:【飘浮】【漂浮】、【漂泊】【飘泊】【飘薄】
  18. python 自动识别图形验证码
  19. 如何在 MacOS Monterey 菜单栏上显示电池百分比
  20. matlab和creo仿真,一种基于Creo和Matlab的复杂空间焊缝曲线的重构方法与流程

热门文章

  1. w10更新后怎么找计算机全民,Win10系统下全民WiFi不能用了怎么办
  2. Spark性能优化之-资源调优
  3. 使用spark.streaming.kafka.consumer.poll.ms和reconnect.backoff.ms解决spark streaming消费kafka时任务不稳定的问题
  4. android L和android M的区别
  5. CAD快捷键小结(一)
  6. 【九校3D2T3】世界第一的猛汉王
  7. 软负载和硬负载的区别分析
  8. android 三维软件 cad,CAD建模号APP
  9. 滴滴打车2015-2016
  10. android系统更新原理简介