最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2023年04月25日 10:14:51   作者:Thomas_Lbw  
本文主要介紹如何制作DLL,將代碼類(lèi)中的方法以接口的形式暴露出來(lái)給exe程序使用。會(huì)涉及類(lèi)廠創(chuàng)建方法實(shí)例、聲明DLL接口、.def文件的使用等,感興趣的可以了解一下

一、DLL介紹

我理解的DLL是windows下的可執(zhí)行文件,也就是PE文件,學(xué)名動(dòng)態(tài)鏈接庫(kù)。一般調(diào)用DLL,也稱(chēng)加載DLL的是EXE文件。它是一種可重用的代碼和數(shù)據(jù)的集合,可以由多個(gè)應(yīng)用程序同時(shí)使用,與靜態(tài)鏈接庫(kù)不同,動(dòng)態(tài)鏈接庫(kù)在運(yùn)行時(shí)加載到內(nèi)存中,以供應(yīng)用程序使用。

一個(gè)exe程序可以帶若干個(gè)dll,如下圖:

正常的windows程序基本都會(huì)帶DLL,包括操作系統(tǒng)內(nèi)核的DLL,所以很關(guān)鍵。

DLL具有以下優(yōu)點(diǎn):

  • 可重用性:由于多個(gè)應(yīng)用程序可以共享一個(gè)DLL,因此它們可以共享相同的代碼和數(shù)據(jù),從而提高了代碼的可重用性。
  • 節(jié)省內(nèi)存:由于DLL在運(yùn)行時(shí)才加載到內(nèi)存中,因此它們可以在不占用過(guò)多內(nèi)存的情況下提供所需的功能。
  • 易于更新:當(dāng)需要更新DLL時(shí),只需替換現(xiàn)有的DLL文件即可,而無(wú)需重新編譯使用該DLL的應(yīng)用程序。
  • 動(dòng)態(tài)鏈接:DLL在運(yùn)行時(shí)才鏈接到應(yīng)用程序中,因此它們可以在應(yīng)用程序啟動(dòng)后動(dòng)態(tài)加載,從而提高了應(yīng)用程序的啟動(dòng)速度。
  • 穩(wěn)定性:由于多個(gè)應(yīng)用程序共享相同的DLL,因此如果DLL中的代碼或數(shù)據(jù)發(fā)生問(wèn)題,則可以在一次更新后修復(fù)所有使用該DLL的應(yīng)用程序。

使用DLL的過(guò)程分為兩個(gè)步驟:首先需要?jiǎng)?chuàng)建一個(gè)DLL,然后在需要使用該DLL的應(yīng)用程序中加載它。為了使DLL中的函數(shù)可以在應(yīng)用程序中使用,必須將其導(dǎo)出,可以使用__declspec(dllexport)修飾符來(lái)導(dǎo)出DLL中的函數(shù)和數(shù)據(jù)。而在應(yīng)用程序中調(diào)用DLL中的函數(shù),需要使用LoadLibrary()函數(shù)來(lái)加載DLL,并使用GetProcAddress()函數(shù)獲取DLL中導(dǎo)出函數(shù)的地址,然后使用函數(shù)指針來(lái)調(diào)用這些函數(shù)。

在Linux下,與之對(duì)應(yīng)的是.so文件。MacOs下為.dylib。

二、C++制作DLL文件

需要打開(kāi)你的windows Visual Satdio任意版本。可以直接選擇創(chuàng)建DLL文件,也可以先創(chuàng)建平臺(tái)程序后續(xù)再改。

這里直接展示一段簡(jiǎn)單的代碼。

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

模塊定義需要在這設(shè)定:

重點(diǎn):

.def文件(也稱(chēng)為導(dǎo)出文件)是一種Windows平臺(tái)上的文件格式,用于描述可執(zhí)行文件或動(dòng)態(tài)鏈接庫(kù)(DLL)中導(dǎo)出函數(shù)的名稱(chēng)和地址。當(dāng)編寫(xiě)一個(gè)DLL并將其與其他應(yīng)用程序鏈接時(shí),該DLL中的函數(shù)必須明確導(dǎo)出,以便其他應(yīng)用程序能夠調(diào)用這些函數(shù)。

2.2 調(diào)用端

代碼:

#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)
		{
			// 調(diào)用 DLL 中的函數(shù)
			int result = add(1, 2);
			std::cout << result << std::endl;
		}
	}
 
}

將UseDllDLL設(shè)置為啟動(dòng)項(xiàng),運(yùn)行結(jié)果(DLL內(nèi)部返回方法的結(jié)果):

三、DLL導(dǎo)出類(lèi)方法

我們定義一個(gè)MyInterface基類(lèi),里面實(shí)現(xiàn)虛方法,再生成一個(gè)它的派生類(lèi)實(shí)現(xiàn)虛方法,最后創(chuàng)建類(lèi)工廠讓客戶(hù)端代碼更容易實(shí)例化類(lèi)對(duì)象。

// 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* 類(lèi)的對(duì)象作為導(dǎo)出接口,它的我實(shí)現(xiàn)是返回它的派生類(lèi)MyImplementation類(lèi)的實(shí)例對(duì)象。客戶(hù)端可以使用CreateMyObject獲得實(shí)例。

客戶(hù)端調(diào)用DLL,首先要有實(shí)現(xiàn)DLL的頭文件MyInerface.h,然后去調(diào)用,具體:

#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
		{
			// 無(wú)法獲取接口
		}
 
		// 卸載DLL
		FreeLibrary(hModule);
	}
	else
	{
		// 無(wú)法加載DLL
	}
 
	return 0;
}

其中typedef MyInterface* (*CreateMyObjectFunc)();聲明了MyInterface*函數(shù)指針的函數(shù)CreateMyObjectFunc,并且沒(méi)有參數(shù),我們可以用CreateMyObjectFunc代替返回值為MyInterface*的函數(shù)的聲明。具體如下:

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

以上就是C++制作DLL文件的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于C++制作DLL文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++直接cout指針名的含義?

    C++直接cout指針名的含義?

    今天小編就為大家分享一篇關(guān)于C++直接cout指針名的含義?,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • C語(yǔ)言實(shí)現(xiàn)自行車(chē)管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)自行車(chē)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)自行車(chē)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++ 實(shí)現(xiàn)漢諾塔的實(shí)例詳解

    C++ 實(shí)現(xiàn)漢諾塔的實(shí)例詳解

    這篇文章主要介紹了C++ 實(shí)現(xiàn)漢諾塔的實(shí)例詳解的相關(guān)資料,這里主要說(shuō)明C++中數(shù)據(jù)結(jié)構(gòu)的遞歸的應(yīng)用,需要的朋友可以參考下
    2017-08-08
  • C++虛函數(shù)表的原理與使用解析

    C++虛函數(shù)表的原理與使用解析

    對(duì)C++?了解的人都應(yīng)該知道虛函數(shù)(Virtual?Function)是通過(guò)一張?zhí)摵瘮?shù)表(Virtual?Table)來(lái)實(shí)現(xiàn)的。簡(jiǎn)稱(chēng)為V-Table。本文就將詳細(xì)講講虛函數(shù)表的原理與使用,需要的可以參考一下
    2022-04-04
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易井字棋游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易井字棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 解決Microsoft?Visual?C++?2010?Express?運(yùn)行及調(diào)試問(wèn)題

    解決Microsoft?Visual?C++?2010?Express?運(yùn)行及調(diào)試問(wèn)題

    這篇文章主要介紹了解決Microsoft?Visual?C++?2010?Express?運(yùn)行及調(diào)試問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • C++ STL 序列式容器與配接器的簡(jiǎn)單使用

    C++ STL 序列式容器與配接器的簡(jiǎn)單使用

    本文主要介紹了C++ STL 序列式容器與配接器的簡(jiǎn)單使用,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • Qt中利用QTextBrowser控件設(shè)計(jì)日志窗口

    Qt中利用QTextBrowser控件設(shè)計(jì)日志窗口

    本文主要介紹了Qt中利用QTextBrowser控件設(shè)計(jì)日志窗口,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • C語(yǔ)言求素?cái)?shù)的幾種方式總結(jié)

    C語(yǔ)言求素?cái)?shù)的幾種方式總結(jié)

    這篇文章主要介紹了C語(yǔ)言求素?cái)?shù)的幾種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • C語(yǔ)言中預(yù)處理命令的使用

    C語(yǔ)言中預(yù)處理命令的使用

    C語(yǔ)言預(yù)處理是編程中非常重要的一個(gè)環(huán)節(jié),通過(guò)預(yù)處理指令和預(yù)處理器的一些特性,本文主要介紹了C語(yǔ)言中預(yù)處理命令的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02

最新評(píng)論

罗甸县| 綦江县| 增城市| 伊川县| 嘉善县| 永川市| 宁安市| 宜兰县| 肃宁县| 宣威市| 治县。| 名山县| 名山县| 吉隆县| 鄂伦春自治旗| 黎平县| 阿城市| 贵州省| 鸡东县| 岗巴县| 石嘴山市| 永兴县| 平罗县| 交城县| 巫山县| 洞口县| 仁寿县| 廊坊市| 仲巴县| 喀什市| 合阳县| 比如县| 亳州市| 吉安县| 青冈县| 阜南县| 德昌县| 龙州县| 张家界市| 莒南县| 博客|