iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++制作DLL文件的方法详解
  • 590
分享到

C++制作DLL文件的方法详解

C++制作DLL文件C++ DLL文件C++ DLL 2023-05-17 17:05:31 590人浏览 独家记忆
摘要

目录一、DLL介绍二、c++制作DLL文件2.1 DLL端2.2 调用端三、DLL导出类方法一、DLL介绍 我理解的DLL是windows下的可执行文件,也就是PE文件,学名动态链

一、DLL介绍

我理解的DLL是windows下的可执行文件,也就是PE文件,学名动态链接库。一般调用DLL,也称加载DLL的是EXE文件。它是一种可重用的代码和数据的集合,可以由多个应用程序同时使用,与静态链接库不同,动态链接库在运行时加载到内存中,以供应用程序使用。

一个exe程序可以带若干个dll,如下图:

正常的windows程序基本都会带DLL,包括操作系统内核的DLL,所以很关键。

DLL具有以下优点:

  • 可重用性:由于多个应用程序可以共享一个DLL,因此它们可以共享相同的代码和数据,从而提高了代码的可重用性。
  • 节省内存:由于DLL在运行时才加载到内存中,因此它们可以在不占用过多内存的情况下提供所需的功能。
  • 易于更新:当需要更新DLL时,只需替换现有的DLL文件即可,而无需重新编译使用该DLL的应用程序。
  • 动态链接:DLL在运行时才链接到应用程序中,因此它们可以在应用程序启动后动态加载,从而提高了应用程序的启动速度。
  • 稳定性:由于多个应用程序共享相同的DLL,因此如果DLL中的代码或数据发生问题,则可以在一次更新后修复所有使用该DLL的应用程序。

使用DLL的过程分为两个步骤:首先需要创建一个DLL,然后在需要使用该DLL的应用程序中加载它。为了使DLL中的函数可以在应用程序中使用,必须将其导出,可以使用__declspec(dllexport)修饰符来导出DLL中的函数和数据。而在应用程序中调用DLL中的函数,需要使用LoadLibrary()函数来加载DLL,并使用GetProcAddress()函数获取DLL中导出函数的地址,然后使用函数指针来调用这些函数。

在Linux下,与之对应的是.so文件。MacOs下为.dylib。

二、C++制作DLL文件

需要打开你的windows Visual Satdio任意版本。可以直接选择创建DLL文件,也可以先创建平台程序后续再改。

这里直接展示一段简单的代码。

2.1 DLL端

DllDLL.h:

#pragma once
#ifdef MYLIBRARY_EXPORTS
#define MYLIBRARY_api __declspec(dllexport)
#else
#define MYLIBRARY_API __declspec(dllimport)
#endif
 
MYLIBRARY_API int Add(int a, int b);

DllDLL.cpp:

#include "DllDLL.h"
 
int Add(int a, int b)
{
	return a + b;
}

DllDLL.def模块定义:

LIBRARY GeneratrDLL
EXPORTS
Add @1

模块定义需要在这设定:

重点:

.def文件(也称为导出文件)是一种Windows平台上的文件格式,用于描述可执行文件或动态链接库(DLL)中导出函数的名称和地址。当编写一个DLL并将其与其他应用程序链接时,该DLL中的函数必须明确导出,以便其他应用程序能够调用这些函数。

2.2 调用端

代码:

#include "..\DllDLL\DllDLL.h"
#include <windows.h>
#include <iOStream>
typedef int(*AddFunc)(int, int);
 
int main()
{
	HINSTANCE hinstLib = LoadLibrary(TEXT("DllDLL.dll"));
	if (hinstLib != NULL)
	{
		AddFunc add = (AddFunc)GetProcAddress(hinstLib, "Add");
		if (add != NULL)
		{
			// 调用 DLL 中的函数
			int result = add(1, 2);
			std::cout << result << std::endl;
		}
	}
 
}

将UseDllDLL设置为启动项,运行结果(DLL内部返回方法的结果):

三、DLL导出类方法

我们定义一个MyInterface基类,里面实现虚方法,再生成一个它的派生类实现虚方法,最后创建类工厂让客户端代码更容易实例化类对象。

// MyInterface.h
#ifndef MY_INTERFACE_H
#define MY_INTERFACE_H
 
class MyInterface
{
public:
	virtual ~MyInterface(){}
	virtual void DoSomething() = 0;
	virtual int GetNumber() = 0;
};
 
class MyImplementation : public MyInterface
{
public:
	virtual void DoSomething() override;
	virtual int GetNumber() override;
};
#endif // MY_INTERFACE_H
 
 
 
 
// MyImplementation.cpp
#include "MyInterface.h"
 
void MyImplementation::DoSomething()
{
	//
}
 
int MyImplementation::GetNumber()
{
	return 49;
}
 
 
 
// MyDLL.h
#ifndef MY_DLL_H
#define MY_DLL_H
 
#ifdef MY_DLL_EXPORTS
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif
 
#include "MyInterface.h"
 
MY_DLL_API MyInterface* CreateMyObject();
 
#endif // MY_DLL_H
 
 
 
// MyDLL.cpp
#define MY_DLL_EXPORTS
#include "MyDLL.h"
#include "MyInterface.h"
 
 
MyInterface* CreateMyObject()
{
	return new MyImplementation();
}

上面代码的最后两端将MyInterface* 类的对象作为导出接口,它的我实现是返回它的派生类MyImplementation类的实例对象。客户端可以使用CreateMyObject获得实例。

客户端调用DLL,首先要有实现DLL的头文件MyInerface.h,然后去调用,具体:

#include "..\GeneratrDLL\MyInterface.h"
#include <Windows.h>
#include <iostream>
 
int main()
{
	// 加载DLL
	HMODULE hModule = LoadLibrary(L"C:\\Users\\liubw\\source\\repos\\GeneratrDLL\\x64\\Debug\\GeneratrDLL.dll");
 
	if (hModule != NULL)
	{
		// 获取接口
        typedef MyInterface* (*CreateMyObjectFunc)();
		CreateMyObjectFunc fun = (CreateMyObjectFunc)GetProcAddress(hModule, "CreateMyObject");
 
		if (fun != NULL)
		{
			// 使用接口
			MyInterface* myObject = createMyObject();
			myObject->DoSomething();
			int number = myObject->GetNumber();
			std::cout << number << std::endl;
			delete myObject;
		}
		else
		{
			// 无法获取接口
		}
 
		// 卸载DLL
		FreeLibrary(hModule);
	}
	else
	{
		// 无法加载DLL
	}
 
	return 0;
}

其中typedef MyInterface* (*CreateMyObjectFunc)();声明了MyInterface*函数指针的函数CreateMyObjectFunc,并且没有参数,我们可以用CreateMyObjectFunc代替返回值为MyInterface*的函数的声明。具体如下:

C/C++】中【typedef】用法大全

以上就是C++制作DLL文件的方法详解的详细内容,更多关于C++制作DLL文件的资料请关注编程网其它相关文章!

--结束END--

本文标题: C++制作DLL文件的方法详解

本文链接: https://www.lsjlt.com/news/211345.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++制作DLL文件的方法详解
    目录一、DLL介绍二、C++制作DLL文件2.1 DLL端2.2 调用端三、DLL导出类方法一、DLL介绍 我理解的DLL是windows下的可执行文件,也就是PE文件,学名动态链...
    99+
    2023-05-17
    C++制作DLL文件 C++ DLL文件 C++ DLL
  • C#操作INI文件的方法详解
    目录INI文件介绍kernel32Demo案例实现功能程序代码扩展作用本文主要介绍通过调用kernel32函数,实现对ini文件的读取和写入。 INI文件介绍 INI文件全称是Ini...
    99+
    2022-11-13
    C#操作INI文件 C#操作INI C# INI文件
  • C++读写(CSV,Yaml,二进制)文件的方法详解
    目录介绍1.读写txt文件2.C++读写CSV文件2.1 写入CSV2.2 读取CSV文件(1)2.3 读取CSV文件(2)2.4 用c++读写二进制文件(1)2.5 用c++读写二...
    99+
    2024-04-02
  • win10打开dll文件的方法
    小编给大家分享一下win10打开dll文件的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!什么是.dll文件dll是Dynamic Link Library的缩写,意为动态链接库。DLL文件一般被存放在C:Window...
    99+
    2023-06-12
  • Windows系统中的DLL文件详解
    DLL(Dynamic Link Library)文件是Windows系统中的一种动态链接库文件,它包含了一组可被应用程序调用的函数...
    99+
    2023-09-15
    Windows
  • C#文件浏览器制作方法是什么
    这篇文章主要介绍“C#文件浏览器制作方法是什么”,在日常操作中,相信很多人在C#文件浏览器制作方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#文件浏览器制作方法是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-17
  • 使用C/C++读写.mat文件的方法详解
    目录一、创建工程并添加测试代码二、修改CmakeLists文件三、添加环境变量四、令人头秃的错误五、运行结果总结最近需要使用C++来处理matlab生成的数据, 参考了网上一些博客,...
    99+
    2024-04-02
  • C#操作xml文件的方法
    本篇内容介绍了“C#操作xml文件的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#操作xml文件实例是如何的呢?让我们先看看问题:已...
    99+
    2023-06-17
  • 在C#程序中注入恶意DLL的方法详解
    目录一、背景二、实现原理1. 基本思路2. 案例演示3. 自定义注入三:总结一、背景 前段时间在训练营上课的时候就有朋友提到一个问题,为什么 Windbg 附加到 C# 程序后,程序...
    99+
    2024-04-02
  • C#反射调用dll文件中的方法操作泛型与属性字段
    一、使用方法 查找DLL文件,通过Reflection反射类库里的各种方法来操作dll文件 二、步骤 加载DLL文件 Assembly assembly1 = Assembly.Lo...
    99+
    2024-04-02
  • C#递归方法复制文件夹的方法
    这篇文章主要介绍“C#递归方法复制文件夹的方法”,在日常操作中,相信很多人在C#递归方法复制文件夹的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#递归方法复制文件夹的方法”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-17
  • 在windows中注册dll文件的方法
    如何在Windows中注册dll文件 在运行中输入 regsvr32 dllname.dll 命令,其中dllname是你的dll文件名。 此命令自动在widnows\system,windows\system32文件夹...
    99+
    2023-05-26
    dll文件注册 文件 dll windows 方法
  • C语言文件操作详解
    目录一、什么是文件二、文件缓冲区三、文件指针四、文件的打开和关闭。总结一、什么是文件 在程序设计中,我们一般谈的文件有两种:程序文件、数据文件。 程序文件: 包括源程序文件(后缀为....
    99+
    2024-04-02
  • C#实现读写CSV文件的方法详解
    目录CSV文件标准文件示例RFC 4180简化标准读写CSV文件使用CsvHelper使用自定义方法总结项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件的解析。本文会介...
    99+
    2024-04-02
  • C++文件读写操作详解
    目录一、读写文本文件1.1 写文件1.2读文件二、读写二进制文件2.1 写文件2.2 读文件一、读写文本文件 1.1 写文件 写文件步骤如下: 包含头文件 #include <...
    99+
    2024-04-02
  • C++提取文件名与提取XML文件的方法详解
    目录1、提取文件名2、提取XML文件总结1、提取文件名 查找容器内子序列的最后一次出现的位置 std::find_end(str.begin(), str.end(), patter...
    99+
    2024-04-02
  • Python文件操作之二进制文件详解
    目录1.二进制读取模式rb读取模式将读取到的内容写入到文件总结1.二进制读取模式 rt 读取文本文件(默认值) rb 读取二进制文件 file_name = ...
    99+
    2024-04-02
  • Python自动操作Excel文件的方法详解
    目录工具读取Excel文件内容写入Excel文件内容Excel文件样式调整设置表头的位置设置单元格的宽高总结工具 python3.7 Pycharm Excel xlwt&x...
    99+
    2024-04-02
  • C语言中的文件操作详解
    目录1.为什么使用文件2.什么是文件2.1程序文件2.2数据文件2.3文件名3.文件的打开和关闭3.1文件指针3.2文件的打开和关闭4.文件的顺序读写5.文件的随机读写5.1fsee...
    99+
    2024-04-02
  • C#操作XML方法详解
    目录 using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作