Windows动态链接库使用详解

本文介绍了C++中动态链接库(DLL)的概念及其创建方法。详细解释了如何使用Visual Studio创建DLL项目,并展示了导出函数的具体实现。此外,还提供了如何在客户端程序中加载并调用DLL中导出函数的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

概念

生成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 模块的句柄。LoadLibraryLoadLibraryExLoadPackagedLibrary 或 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;
}

运行截图

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员陈子青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值