21xrx.com
2024-12-22 22:08:41 Sunday
登录
文章检索 我的文章 写文章
如何在C++中加载动态库?
2023-06-27 15:25:18 深夜i     --     --
C++ 动态库 加载

动态库(Dynamic Link Library,简称DLL)是一种非常重要的库文件,可以为C++程序提供额外的功能。在C++中,加载动态库可以帮助程序员提高代码复用性,降低代码量,提升开发效率。本文将介绍如何在C++中加载动态库。

一、什么是动态库?

动态库是指在程序运行时,需要一些额外的代码才能够完成任务的库文件。与静态库不同,动态库并不会在编译时被链接到程序中,而是在程序运行时被动态加载。这样做可以减少程序占用内存空间。

二、动态库的加载方法

2.1 使用动态链接库(Dynamic Link Library,缩写为DLL)方法。

DLL应该是最常用最简单的动态链接方法了。 一般而言,DLL中包含的是一些函数,这些函数可以被其他模块所调用。DLL的典型应用是window系统中关键的系统dll就如kernel32.dll,user32.dll,advapi32.dll等。 假设我们现在写了一个函数f, 在工程中我们可以使用静态链接或者动态链接去调用它。其中,静态链接是指将函数f的代码拷贝到我们程序运行的可执行文件中,在程序运行时直接调用;而动态链接是指将函数f的代码单独编译在一个DLL文件中,程序运行时需要该函数时,通过加载该DLL中的代码来调用该函数。

下面我们就分别来看一下这两个链接方式。

静态链接:

 #include "function.h"

 int main(){

   printf("the result is %f", f(2.2, 3.3));

   return 0;

 }

其中,function.h包含了函数f的声明或定义。 一般情况下我们会将function.c的代码编译成一个obj文件,然后将生成的obj文件加入到工程中去。当我们对工程进行编译时,编译器会将main.c与function.o进行链接,生成可执行程序。

另外一种链接方式就是动态链接。

二、动态库的加载方法

C++中有几种方法可以加载动态库。这里我们主要讲解LoadLibrary()函数和GetProcAddress()函数。其中,LoadLibrary()函数用于打开动态库,而GetProcAddress()函数用于获取动态库中的函数地址。

下面我们以加载Windows系统中的Kernel32.dll动态库为例,来展示如何在C++中加载动态库。

步骤1:使用LoadLibrary()函数加载动态库

首先,我们需要使用LoadLibrary()函数加载动态库。该函数在Windows.h头文件中定义,其原型如下:

HINSTANCE LoadLibrary(

 LPCWSTR lpLibFileName

);

其中,参数lpLibFileName是动态库的文件名,它可以是全路径名。如果是简单的文件名,则Windows会在标准搜索路径中查找该文件。

例如,我们可以使用以下代码加载Kernel32.dll动态库:

HINSTANCE hDll = LoadLibrary(L"kernel32.dll");

该代码将返回一个有效的指向Kernel32.dll的句柄。如果加载失败,则该函数将返回NULL,并可以使用GetLastError()函数查看错误代码。

步骤2:使用GetProcAddress()函数获取函数地址

接下来,我们需要使用GetProcAddress()函数获取动态库中的函数地址。该函数在Windows.h头文件中定义,其原型如下:

FARPROC GetProcAddress(

 HMODULE hModule,

 LPCSTR lpProcName

);

其中,参数hModule是动态库的句柄,它可以由LoadLibrary()函数返回。参数lpProcName是要获取的函数名称。

例如,我们可以使用以下代码获取Kernel32.dll动态库中的GetSystemTime()函数的地址:

FARPROC pFunc = GetProcAddress(hDll, "GetSystemTime");

该代码将返回指向GetSystemTime()函数的指针。如果获取失败,则该函数将返回NULL。

步骤3:使用函数指针调用函数

最后,我们可以使用函数指针调用函数。例如,我们可以使用以下代码调用GetSystemTime()函数:

SYSTEMTIME st;

typedef void (*LPFNSYSTEMTIME) (LPSYSTEMTIME);

LPFNSYSTEMTIME lpfnSystemTime = (LPFNSYSTEMTIME) pFunc;

lpfnSystemTime(&st);

该代码定义了一个函数指针类型LPFNSYSTEMTIME,并将GetSystemTime()函数的指针转换为了该类型的指针。接下来,我们可以使用该指针调用GetSystemTime()函数,并传递一个SYSTEMTIME结构体指针作为参数。

总结:

本文主要介绍了C++中如何加载动态库。首先,我们使用LoadLibrary()函数加载动态库,然后使用GetProcAddress()函数获取动态库中的函数地址。最后,我们可以使用函数指针调用函数。这种方法可以提高代码复用性,降低代码量,提升开发效率。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复