如果学习代码不是为了偷懒那将毫无意义
前言
最近遇到项目上的需求,交接时需要修改底层代码,这让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");
}
接下来开始在属性中配置环境:
- 读取.h
右键项目进入属性,在“附加包含目录”中添加动态库的目录。
- 读取.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主“老蓝的程序教程”的教学视频!