C++ 动态链接库快速创立和两种调用方式

前言

最近遇到项目上的需求,交接时需要修改底层代码,这让C++二把刀的我十分痛苦。好在通过讨论,甲方愿意通过调用动态链接库的方式接收我方数据。在b站up主老蓝的程序教程的教学视频下got到了一整套流程,特意写贴,以作备份。

动态链接库的创立

创建项目

在头文件和源文件新建.h和.cpp文件,用来写主要函数。
在这里插入图片描述
在Q.h中加入如下代码:

#pragma once

#ifdef BUILD_MYDLL
#define API_SYMBOL __declspec(dllexport)
#else 
#define API_SYMBOL __declspec(dllimport)
#endif

extern"C" API_SYMBOL int convert_array (int* data, int len);

在Q.cpp中加入如下代码:

#include"StdAfx.h"
#define BUILD_MYDLL
#include"Q.h"
#include<iostream>
using namespace std;

int convert_array(int* data ,int len){
	for (int i=0;i<len ;i++){
	cout<<data[i]<<",";
	}
	cout << endl;

	int nTotal = 0;
	for (int i=0;i<len;i++){
	nTotal+=data[i];
	--data[i];
	}
return nTotal;
}

点击调试,出现如下输出则代表创建成功:
在这里插入图片描述
其中Example.dll和Example.lib在根目录\MYDL\Debug中,如果别人想调用动态链接库,把dll、lib、头文件和怎么输入输出给别人就行,。下面介绍如何自己调用,方便调试。

含蓄的(隐式)调用动态链接库

称为含蓄的(隐式)调用动态链接库是因为项目需要将.dll和.lib文件在属性中提前配置。首先在解决方案里新建CLR控制台应用程序
在这里插入图片描述
将implicit.cpp中的代码全部换成:

// demoinvokeDLL.cpp: 主项目文件。
#include "stdafx.h"
#include<iostream>
#include"Q.h"
using namespace std;

int main()
{
	int arr[]={3,6,7,8};
	int nLen=sizeof(arr)/sizeof(int);
	int nTotal=convert_array(arr,nLen);
	cout <<"数组元素求和结果:"<< nTotal<<endl;
	cout<<"数组元素新值:"<<endl;
	for (int i=0;i<nLen;i++){
	cout<<arr[i]<<",";
	}
	system("pause");
}

接下来开始在属性中配置环境:

  1. 读取.h
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

右键项目进入属性,在“附加包含目录”中添加动态库的目录。

  1. 读取.lib和.dll
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

开始调试,以下为正确结果:
在这里插入图片描述

粗暴的(显式)调用动态链接库

称为含蓄的(隐式)调用动态链接库是因为不需要配置环境,直接暴力读取。首先新建项目:
在这里插入图片描述
将violent.cpp里代码全部复制成:

// xsinvokeDll.cpp: 主项目文件。
#include"stdafx.h"
#include<iostream>
#include<Windows.h>

using namespace std;
typedef int (*LPDO_ARRAY) (int *pArr,int nLen);

int main(){

	HINSTANCE hDll;//定义一个实例句柄,引用动态库
	LPDO_ARRAY lpDo_array;//定义一个函数指针,用来指向导出函数

	//第二步,加载DemoDll.dll动态库文件
	hDll = LoadLibrary(L"Example.dll");
	if (hDll!=NULL){
	//第三步,获取dll中的函数地址
		lpDo_array=(LPDO_ARRAY)GetProcAddress(hDll,"convert_array");
		if(lpDo_array!=NULL)
		{
		//第四步 调用函数
			int nArr[]={1,2,4,6};
			int nLen=sizeof(nArr)/sizeof(int);
			int nRet;

			//通过函数指针lpDo_array调用函数
			nRet = lpDo_array(nArr,nLen);
			cout<<"返回值:"<<nRet<<endl;
			cout<<"数组新值:";
			for (int i= 0 ; i<nLen;++i)
				{
				cout<<nArr[i]<<",";
				}		
		}
		//第五步,释放动态库句柄
		FreeLibrary(hDll);

	}
		system("pause");
}

开始调试,调试结果为:
在这里插入图片描述

尾言

都是工程运用,不需要多解释有的没的,怎么快怎么来。饭喂嘴里也要自己嚼过才能咽下去。感谢b站up主“老蓝的程序教程”的教学视频!

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值