[速成] Visual Studio C/C++创建Dll(动态链接库)并调用

这篇具有很好参考价值的文章主要介绍了[速成] Visual Studio C/C++创建Dll(动态链接库)并调用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以下示例均在VS2022环境下完成。

一、创建动态链接库(C++)

1.新建动态链接库项目模版:

visual studio 2022生成dll,c++,c语言

2.新建项目MyC++_Dll后,默认目录结构如下:

visual studio 2022生成dll,c++,c语言

3.添加并新建头文件MyC++_Dll.h和源码文件MyC++_Dll.cpp(用于声明和定义函数接口):

visual studio 2022生成dll,c++,c语言

4.MyC++_Dll.h示例如下:

#pragma once

#ifdef _EXPORTING
#define _DLL_API _declspec(dllexport)
#else
#define _DLL_API _declspec(dllimport)
#endif

#ifdef __cplusplus
class Dll_Class
{
public:
	Dll_Class();
	~Dll_Class();
	virtual int Addition(int a, int b);
};

extern "C"
{
	_DLL_API Dll_Class *CreateObject();
	_DLL_API void ReleaseObject(Dll_Class *pObject);
	_DLL_API int Multiplication_TypeC(int a, int b);
	_DLL_API int Addition_TypeC(int a, int b);
}
#endif

注意:

_EXPORTING 是笔者自定义宏,用于区分当前是导出dll还是调用dll,要实现导出函数,还需要在实现Dll函数功能的项目属性里,添加预处理定义(记得结尾加分号),如下图:

visual studio 2022生成dll,c++,c语言

_declspec(dllexport) 是VC的关键字,表示导出函数到dll;

_declspec(dllimport) 是VC的关键字,表示从dll调用函数;

_DLL_API 是笔者自定义宏,用于给需要导入导出的函数接口简化代码、快速替换_declspec(dllimport)_declspec(dllexport)关键字;

如果_EXPORTING被定义,采用导出模式,否则为调用模式;

__cplusplus 宏表示采用的是C++的编译环境,通过#ifdef __cplusplus可判断当前是否为C++的编译环境;

extern "C" {} 表示代码块内的函数采用C语言方式编译.

5.MyC++_Dll.cpp示例如下(具体功能实现):

#include "pch.h"
#include "MyC++_Dll.h"

Dll_Class::Dll_Class() {

}

Dll_Class::~Dll_Class() {

}

int Dll_Class::Addition(int a, int b) {
	return a + b;
}

Dll_Class* CreateObject() {
	Dll_Class* pClass = new Dll_Class();
	return pClass;
}

void ReleaseObject(Dll_Class* pObject) {
	if (pObject) {
		delete pObject;
		pObject = NULL;
	}
}

int Multiplication_TypeC(int a, int b) {
	return a * b;
}

int Addition_TypeC(int a, int b) {
	return a + b;
}

6.编译代码生成lib和dll等文件,如下图:

visual studio 2022生成dll,c++,c语言

二、创建动态链接库(C)

1.新建空项目MyC_Dll:

visual studio 2022生成dll,c++,c语言

2.添加并新建头文件MyC_Dll.h和源码文件MyC_Dll.cpp(用于声明和定义函数接口):

visual studio 2022生成dll,c++,c语言

3.MyC_Dll.h示例如下:

#ifndef _MYC_DLL_HEADER_FILE
#define _MYC_DLL_HEADER_FILE

#ifdef   _EXPORTING
#define  _DLL_API __declspec(dllexport)
#else
#define  _DLL_API __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C"
{
	_DLL_API int Addition_TypeC(int a, int b);
	_DLL_API int Multiplication_TypeC(int a, int b);
}
#endif
#endif

注意:

_EXPORTING 是笔者自定义宏,用于区分当前是导出dll还是调用dll,要实现导出函数,还需要在实现Dll函数功能的项目属性里,添加预处理定义(记得结尾加分号),如下图:

visual studio 2022生成dll,c++,c语言

_declspec(dllexport) 是VC的关键字,表示导出函数到dll;

_declspec(dllimport) 是VC的关键字,表示从dll调用函数;

_DLL_API 是笔者自定义宏,用于给需要导入导出的函数接口简化代码、快速替换_declspec(dllimport)_declspec(dllexport)关键字;

如果_EXPORTING被定义,采用导出模式,否则为调用模式;

__cplusplus 宏表示采用的是C++的编译环境,通过#ifdef __cplusplus可判断当前是否为C++的编译环境;

extern "C" {} 表示代码块内的函数采用C语言方式编译.

4.MyC_Dll.cpp示例如下(具体功能实现):

#include "MyC_Dll.h"

int Addition_TypeC(int a, int b) {
	return a + b;
}

int Multiplication_TypeC(int a, int b) {
	return a * b;
}

5.要在项目属性里修改配置类型为动态库(.dll)才能生成dll,如下图:

visual studio 2022生成dll,c++,c语言

6.编译代码生成lib和dll等文件,如下图:

visual studio 2022生成dll,c++,c语言

三、隐式调用Dll

1.创建空项目Call_dll:

visual studio 2022生成dll,c++,c语言

2.添加并新建源码文件Call_Dll.cpp:

visual studio 2022生成dll,c++,c语言

3.Call_Dll.cpp示例如下(具体调用函数接口实现):

//定义是否用C语言编译
//#define USING_C

#ifdef USING_C
#include <stdio.h>

#include "../MyC_Dll/MyC_Dll.h"
#pragma comment(lib, "../Debug/MyC_Dll.lib")
#else
#include <iostream>
using namespace std;

#include "../MyC++_Dll/MyC++_Dll.h"
#pragma comment(lib, "../Debug/MyC++_Dll.lib")
#endif

int main()
{
#ifdef USING_C
	int a = 8, b = 6;

	printf("Addition_TypeC result = %d\n", Addition_TypeC(a, b));
	printf("Multiplication_TypeC result = %d\n", Multiplication_TypeC(a, b));
#else
	int a = 8, b = 6;
	Dll_Class* pMyDll_Object = CreateObject();

	cout << "My_Dll_Class.Addition result = " << pMyDll_Object->Addition(a, b) << endl;
	cout << "Addition_TypeC result = " << Addition_TypeC(a, b) << endl;
	cout << "Multiplication_TypeC result = " << Multiplication_TypeC(a, b) << endl;

	ReleaseObject(pMyDll_Object);
#endif

	return 0;
}

注意:

(1)#pragma comment(lib, Lib文件)和 #include "dll头文件"要确保真实存在的路径.

(2)笔者这里用#ifdef USING_C来选择用C语言还是C++风格(二者主要区别在于用C还是C++编程语句,以及调用Dll的数据结构类型,是否是C++独有的)调用.

4.Dll文件复制到Call_Dll项目生成的目标路径,如下图:

visual studio 2022生成dll,c++,c语言

注意:隐式调用,要求dll文件与exe文件在同一目录或者dll文件注册在操作系统的全局运行环境.

5.编译代码生成exe文件,运行结果如下图:

C++:

visual studio 2022生成dll,c++,c语言

C:

visual studio 2022生成dll,c++,c语言文章来源地址https://www.toymoban.com/news/detail-764418.html

四、显式调用Dll

1.创建空项目Call_dll:

visual studio 2022生成dll,c++,c语言

2.添加并新建源码文件Call_Dll.cpp:

visual studio 2022生成dll,c++,c语言

3.Call_Dll.cpp示例如下(具体调用函数接口实现):

//定义是否用C语言编译
//#define USING_C

#ifdef USING_C
#include <stdio.h>
#else
#include <iostream>
using namespace std;
#endif
#include <Windows.h>

int main()
{
	HINSTANCE hdll;

#ifdef USING_C
	typedef int (*_Fun_Addition_TypeC)(int, int);
	typedef int (*_Fun_Multiplication_TypeC)(int, int);

	hdll = LoadLibrary(L"MyC_Dll.dll");
	if (hdll == NULL) {
		printf("Error: Load dll fail.\n");
		return -1;
	}

	_Fun_Addition_TypeC Addition_TypeC;
	_Fun_Multiplication_TypeC Multiplication_TypeC;

	Addition_TypeC = (_Fun_Addition_TypeC)GetProcAddress(hdll, "Addition_TypeC");
	Multiplication_TypeC = (_Fun_Multiplication_TypeC)GetProcAddress(hdll, "Multiplication_TypeC");

	if (Addition_TypeC == NULL || Multiplication_TypeC == NULL) {
		printf("Error: Call functions fail.\n");
		return -2;
	}

	int a = 8, b = 6;
	printf("Addition_TypeC result = %d\n", Addition_TypeC(a, b));
	printf("Multiplication_TypeC result = %d\n", Multiplication_TypeC(a, b));
#else
	class _Dll_Class
	{
	public:
		//_Dll_Class();
		//~_Dll_Class();
		virtual int Addition(int a, int b)=0;
	};

	typedef _Dll_Class* (*_Fun_CreateObject)();
	typedef void (*_Fun_ReleaseObject)(_Dll_Class*);
	typedef int (*_Fun_Multiplication_TypeC)(int, int);
	typedef int (*_Fun_Addition_TypeC)(int, int);

	hdll = LoadLibrary(L"MyC++_Dll.dll");
	if (hdll == NULL) {
		printf("Error: Load dll fail.\n");
		return -1;
	}

	_Fun_CreateObject CreateObject = (_Fun_CreateObject)GetProcAddress(hdll, "CreateObject");
	_Fun_ReleaseObject ReleaseObject = (_Fun_ReleaseObject)GetProcAddress(hdll, "ReleaseObject");
	_Fun_Addition_TypeC Addition_TypeC = (_Fun_Addition_TypeC)GetProcAddress(hdll, "Addition_TypeC");
	_Fun_Multiplication_TypeC Multiplication_TypeC = (_Fun_Multiplication_TypeC)GetProcAddress(hdll, "Multiplication_TypeC");

	if (CreateObject == NULL || ReleaseObject ==NULL || Addition_TypeC == NULL || Multiplication_TypeC == NULL) {
		printf("Error: Call functions fail.\n");
		return -2;
	}

	int a = 8, b = 6;
	_Dll_Class* pMyDll_Object = CreateObject();

	cout << "My_Dll_Class.Addition result = " << pMyDll_Object->Addition(a, b) << endl;
	cout << "Addition_TypeC result = " << Addition_TypeC(a, b) << endl;
	cout << "Multiplication_TypeC result = " << Multiplication_TypeC(a, b) << endl;

	ReleaseObject(pMyDll_Object);
#endif

	if (hdll == NULL) {
		FreeLibrary(hdll);
		hdll = NULL;
	}

	return 0;
}

注意:

(1)LoadLibrary(dll文件路径)要确保真实存在的路径.

(2)笔者这里用#ifdef USING_C来选择用C语言还是C++风格(二者主要区别在于用C还是C++编程语句,以及调用Dll的数据结构类型,是否是C++独有的)调用.

 4.Dll文件复制到LoadLibrary(dll文件路径)指定的路径,如下图:

visual studio 2022生成dll,c++,c语言

注意:显式调用,要求dll文件路径LoadLibrary(dll文件路径)相同,当前示例与exe文件同目录。

5.编译代码生成exe文件,运行结果如下图:

C++:

visual studio 2022生成dll,c++,c语言

C:

visual studio 2022生成dll,c++,c语言

到了这里,关于[速成] Visual Studio C/C++创建Dll(动态链接库)并调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 软件崩溃时Visual Studio中看不到有效的调用堆栈,使用Windbg动态调试去分析定位

    目录 1、问题说明 2、使用Windbg查看崩溃时详细的函数调用堆栈

    2024年02月05日
    浏览(60)
  • 诊断DLL——Visual Studio安装与dll使用

    官方下载地址:https://visualstudio.microsoft.com/zh-hans/ 本专栏使用 Win10 x64 操作系统安装 Visual Studio 2022 无论是用CANoe还是周立功软件,亦或是Diva自动化测试,都需要加载27服务的安全算法,存在一种载体能够动态修改且被调用的库文件,否则对于无序的安全种子来说,没有太多的

    2024年02月07日
    浏览(88)
  • visual studio解决bug封装dll库

    配置属性/常规/输出目录 链接器/常规/输出dll文件 链接器/调试/输出程序数据库pdb文件 链接器/高级/导入库 然后修改更新说明 更新说明格式如下: 4.将库提交到FTP每日更新库文档下 和测试交接、提交解决禅道bug

    2024年02月07日
    浏览(46)
  • visual studio 生成dll文件以及修改输出dll文件名称操作

    Windows系统下Visual Studio可以通过.def文件创建dll。 1.确定需要导出的函数,test.cpp文件中定义如下 2. 添加 .def文件,一般添加到源文件下面。 * 在代码栏下面有一个“模块定义文件”,即我们的.def文件 3.编写test.def文件 文件添加完成,下一步即可设置一些导出规则。 4.在我们的

    2024年02月14日
    浏览(45)
  • 利用Visual Studio 2022 导出目标dll API接口

    操作路径: 指令如下:

    2024年02月12日
    浏览(40)
  • 解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

    有几年没有用过VS编程了,最近对Winlicense感兴趣,就试着运行其提供的WinLicenseSDKExamplesSDKGet HardwareIDProyecto1.sln,遇到DLL引用问题,把解决的过程记录在本文。 我的编译环境是:Win7,64位系统,Visual studio enterprise 2015,.net framework 4.8 WinLicenseSDK目录如下:  其下面Lib目录如下:

    2024年02月04日
    浏览(51)
  • Visual Studio关于C#项目Dll的引用几种方式

    右键“引用”,点击“添加引用”(Net Framework项目) 或者右键“依赖项”,点击“添加项目引用” 打开“引用管理器”窗口,切换到“项目”一栏 在右侧列表中,勾选需要引用的项目,然后点击确定 推荐在解决方案文件夹下创建一个专门的文件夹用于存放外部引用的dll 右

    2024年02月02日
    浏览(44)
  • Python调用动态链接库(DLL)

    Python调用动态链接库(DLL) 动态链接库(Dynamic Link Libraries,简称DLL)是一种被多个程序共享的库文件,可以被用于将程序分解为小模块,减少内存占用,加快程序运行速度。而Python作为一种高级编程语言,可以方便地调用外部的DLL文件。 在Python中,可以使用ctypes模块来调用

    2024年02月13日
    浏览(52)
  • LabVIEW调用动态链接库DLL

    LabVIEW调用动态链接库DLL 要调用DLL,首先必须确定该库是C/ C ++ DLL还是Microsoft .NET Assembly / .NET DLL。 若要确定具有哪种类型的库,可以检查DLL文件的可移植可执行(PE)标头。 DLL 是 C/ C ++ DLL : 1.       如果没有头文件,请查找头文件(* .h)或函数原型定义,请跳

    2024年02月03日
    浏览(46)
  • Visual Studio中C++部分的官方文档链接【微软(Microsoft)所有产品的官方文档链接】

    目前(2022年07月),微软官方网站上关于Visual Studio的文档,最老的版本也是VS2015了,如下图所示: 微软所有产品的文档目录: 中文版:https://docs.microsoft.com/zh-CN/documentation/ 英文版:https://docs.microsoft.com/en-us/documentation/ Visual Studio中C++部分的官方文档: 中文版:https://docs.microso

    2024年02月07日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包