亚博lol C ++ _ write动态链接库

日期:2021-02-21 08:13:25 浏览量: 95

动态链接库简介

动态链接库(Dynamic Link Library或Dynamic-link Library,缩写为DLL)是Microsoft在Microsoft Windows操作系统中实现共享功能库的概念的一种方法。这些库函数的扩展名是“ .dll”,“。ocx”(包括ActiveX控件库)或“ .drv”(旧系统驱动程序)。

动态链接为进程提供了一种调用不属于其可执行代码的功能的方法。该函数的可执行代码在DLL文件中,该DLL文件包含一个或多个与使用它们的过程分开编译c++ 动态链接库,链接和存储的函数。 DLL还有助于共享数据和资源。多个应用程序可以同时访问内存中单个DLL副本的内容。

模块化可以通过使用DLL来实现澳洲欢乐8app ,DLL由相对独立的组件组成,可以更快地加载和应用每个模块的功能,并且更容易将更新应用于每个模块。

例如,一个程序包含许多功能,并且全部都写入了DLL文件。更新软件时,仅需要更新相应的DLL文件,而无需重新安装整个程序

编写DLL

1、创建一个新项目,使用VS2015编写一个可以添加两个数字的DLL

文件->新建项目-> win32项目->下一步-> DLL->检查预编译的头文件,导出符号->完成

此时亚博买球 ,VS2015将自动生成3个头文件和3个cpp文件

这里写图片描述

其中TestDll.h是DLL的头文件

#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif
// 此类是从 TestDll.dll 导出的
class TESTDLL_API CTestDll {
public:
    CTestDll(void);
    // TODO:  在此添加您的方法。
};
//导出的变量
extern TESTDLL_API int nTestDll;
//导出函数
TESTDLL_API int fnTestDll(void);

stdafx.h包含必需的头文件

#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN             
#include 

TestDll.cpp是源文件

DllMain是动态链接库的入口点。在DllMain函数中,hModule参数是DLL模块的句柄,它表示该文件的映像所使用的基址,该基址将被加载到进程的地址空间中。 ul_reason_for_call参数的指示符是此调用的原因,包括

2、将TestDll.h中的导出功能更改为

TESTDLL_API int fnTestDll(int a,int b);

删除导出变量和导出类部分

3、将TestDll.cpp文件中的导出功能更改为

TESTDLL_API int fnTestDll(int a, int b)
{
    return a+b;
}

删除导出类和导出变量部分

注意:Dll可以定义两个函数c++ 动态链接库,一个是内部函数,另一个是派生函数。内部功能只能由定义此功能的模块使用,导出的功能不仅可以在此模块中调用,还可以由其他模块调用。 dll的主要功能是导出功能供其他模块使用

这时,完成了一个将两个数字相加的简单DLL。下一步是如何加载此Dll。加载此dll有两种方法ag真人 ,一种是隐式动态链接,另一种是显示动态链接

隐式动态链接

创建一个新的win32控制台程序,生成刚编写的dll,将TestDll.lib,TestDll.dll,TestDll.h复制到控制台程序的文件夹中pg电子平台 ,然后添加以下代码

#include "stdafx.h"
#include 
#include "TestDll.h"
using namespace std;
#pragma comment(lib,"TestDll")
int main()
{
    int a, b, result;
    while (cin >> a >> b)
    {
        result = fnTestDll(a, b);
        cout << "Result : " << result << endl;
    }
    return 0;
}

#pragma comment(lib,“ TestDll”)表示您要连接到TestDll.lib库。要使用隐式动态链接,您需要指定库的位置(在此示例中为当前文件夹中)。静态突变也会导致可执行文件的大小变大

测试结果

程序员的自我修养—链接,装载与库 pdf_程序员的自我修养:链接,装载和库pdf_c++ 动态链接库

这里写图片描述

您可以看到操作成功

显式动态链接

该模块使用LoadLIbrary()或LoadLIbraryEx()函数来显式加载DLL。加载后,它将调用GetProcAddress()函数以获取DLL导出函数的地址,然后调用该函数。

1、在原始DLL项目中创建一个模块定义文件(DEF),以指定要导入的功能。

TestDll中的项目->添加新项目->模块定义文件(.def)

然后添加

EXPORTS
fnTestDll

fnTestDll表示要导出的函数的名称

重新生成项目

2、创建一个新的win32控制台程序并添加以下代码

显式调用DLL分为三个步骤

声明要导出的DLL函数加载目标DLL,即LoadLibrary()函数,该函数将DLL加载到进程的虚拟地址空间中,如果成功鸭脖app官网 ,则返回DLL模块的句柄,否则返回NULL获取导出函数的地址,即GetProcAddress()函数,成功时返回函数地址,否则返回NULL

测试结果

这里写图片描述