1、创建Win32控制台应用程序:
本文只针对在VS2008编译环境封装动态链接库,其他版本请参见C/C++创建动态链接库(VS2019)。创建win32控制台应用程序,选择DLL,勾选空项目,创建一个空项目(不需要预编译头文件,避免调用出现预编译头文件无法打开的问题)。
2、新建DLL.h文件:
DLL.h文件用于导出函数体、结构体、变量等参数。本文主要介绍针对结构体类型函数的封装以及结构体传值过程。
其中DLL.h文件在生成DLL动态库文件后放置于Include文件中提供给使用者调用。framework.h头文件中为封装函数中所要使用到的所有头文件,特别是结构体中的参数需要定义的头文件。在生成DLL后可修改DLL.h文件,将其注释即可,或者也放入Include文件中提供给使用者。
结构体按照如下定义,在外部使用结构体时可直接使用进行传值,不需要再次定义结构体。
framework.h
#pragma once
#include "iostream"
#include "cmath"
#include "vector"
#include "string"
#include "atlstr.h"
#include "stdlib.h"
using namespace std;
DLL.h
#ifndef LIKEDLL_DLL_H
#define LIKEDLL_DLL_H
#include "framework.h"
#endif
#ifdef EXOPORTINO_DLL
#define API_TYPE extern "C" __declspec(dllexport)
#else
#define API_TYPE __declspec(dllimport)
struct INTEPSECTION_POINT
{
int pointNo;
CString cdID;
vector<float> order;
map<int, CString> materialMap;
}
API_TYPE bool LikeDLL(INTEPSECTION_POINT &Temp);
3、新建DLL.cpp文件:
建立DLL.cpp文件,将所需要用到的函数放在当前CPP中,具体格式示例如下:
#include "framework.h"
#include "DLL.h"
#define EXPORTING_DLL
bool LikeDLL(INTEPSECTION_POINT &Temp)
{
bool flag = false;
for(int i=0;i<100;i++)
{
int point;
point=Temp.pointNo+i;
Temp.order.push_back(point);
}
return flag;
}
4、生成DLL:
重新生成解决方案,在项目文件夹内Debug文件夹内将将生产动态库文件Dll.dll和静态链接库文件Dll.lib。新建文件夹,将对应文件放入,如下:
1、bin文件夹:存放.dll文件
2、lib文件夹:存放.lib文件
3、include文件夹:存放输出函数头文件
5、函数调用:
使用链接库分为静态链接和动态链接,如下:
(一)动态链接方法:
1、将Include文件夹添加到工程
解决方案>属性>C/C++>附加包含目录
2、将lib文件夹添加到工程
解决方案>属性>链接器>附加库目录
3、将lib文件添加到工程
解决方案>属性>链接器>附加依赖库
4、将dll文件拷贝到项目工程文件下
(二)静态链接方法:
1、将DLL.lib、DLL.dll和DLL.h文件拷贝到新建的项目文件内
2、在Cpp文件中使用如下代码调用静态库
#include "DLL.h"
#pragma comment (lib,"DLL.lib")
int main()
{
INTEPSECTION_POINT Temp;
Temp.pointNo=10;
LikeDLL(Temp);
}