C++ DLL (动态链接库)编写及调用

本文详细介绍如何在Visual Studio中创建DLL并实现两种调用方式:显式与隐式调用。通过具体步骤与示例代码,帮助读者掌握DLL的制作与应用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、编写

VisualStudio,新建项目,选Win32项目,命名,然后确定

然后直接点“下一步”

然后选择“DLL”和“空项目”,然后“完成”。

创建头文件,代码如下:

#pragma once;
#ifdef DLL_IMPLEMENT  
#define DLL_API __declspec(dllexport)  
#else  
#define DLL_API __declspec(dllimport)  
#endif
DLL_API int add(int x, int y); //简单方法

还有另一种头文件的格式:

#ifndef _Demo_H_
#define _Demo_H_
#include <string.h>
#include <stdio.h>
#ifdef LIBDLL
    #define LIBDLL extern "C" _declspec(dllimport)
#else
    #define LIBDLL extern "C" _declspec(dllexport)
#endif
LIBDLL int Add(int n, int x);
#endif

然后创建对应的.cpp文件:

#define DLL_IMPLEMENT  
  
#include "Test.h"
 
int DLL_API add(int x, int y)  
{  
    return x+y;  
}

对应第二种头文件定义,.cpp文件如下:

#include "test.h"

int Add (int n, int x)
{
	return n + x;
}

然后右键单击工程名,选择“生成”。

然后在解决方案或者项目的Debug文件夹下可以找到项目名称.dll文件。

二、使用dll

1、显式调用

新建win32控制台项目,将上述生成的.dll文件放在新项目的Debug文件夹下即可以使用。

创建一个.cpp文件,代码如下:

#include <Windows.h>
#include <iostream>

using namespace std;

typedef int(*ADD)(int,int);                         //定义函数指针,格式与库里的函数相同,通过函数指针来引用dll库里的函数
typedef int(*ID)(int,char*, char*, char*, char*, char*); 

int main()
{
	//HINSTANCE handle = LoadLibrary(L"DLLTest.dll"); //加L是避免LPCWSTR之类的报错
	HINSTANCE handle = LoadLibrary(L"CreateDLL.dll"); //加L是避免LPCWSTR之类的报错
	                                                //将Dll文件放到生成的exe文件相同的目录下,默认是project
	                                                //下的debug文件夹下。
	
	ADD add_function = (ADD)GetProcAddress(handle,"add");  //通过上面的HINSTANCE来获取、指向dll库里的函数
	
	cout<<add_function(2,3)<<endl;	
	cout<<"end"<<endl;
	
	/*
	int result;
	HINSTANCE handle = LoadLibrary(L"CNSLDLL.dll");
	ID id_function = (ID)GetProcAddress(handle,"id");
	char bank_id[10]; char bank_name[50]; char provice[15]; char city[15]; char address[100];
	cout<<id_function(15,bank_id, bank_name, provice, city, address)<<endl;
	*/
	//cout<<id_function(5,6)<<endl;

}

运行即可。

2、隐式调用

隐式调用需要使用.h, .lib, .dll三件套。

新建一个项目,在VC++目录的“包含目录”里添加链接库头文件的所在目录,在“库目里”添加.lib文件所在的目录。

然后在“链接器”->“输入”->“附加依赖项”中添加.lib文件的名称。

最后和显式调用一样,将.dll文件放在新项目中的Debug目录下,然后在代码中直接include头文件,然后调用函数即可

#include <iostream>
#include <test.h>
using namespace std;
int main(int argc, const char * argv[]){

	cout<<Add(5,11)<<endl;
}

显式调用的不足是,如果只给了dll(没有接口),是没有办法使用dll的。另外dll的显式链接是不支持导出类和变量的。

另外可以使用vs的bin目录下的dumpbin来查看dll的函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值