创建动态库
- 打开Visual Studio 2019,文件
→
\rightarrow
→新建
→
\rightarrow
→项目
→
\rightarrow
→动态链接库(DLL)
→
\rightarrow
→下一步
→
\rightarrow
→项目名称:DemoDll
 - 右键头文件
→
\rightarrow
→添加
→
\rightarrow
→新建项
→
\rightarrow
→添加头文件
mydll.h 。  - 右键源文件,添加源文件
mydll.cpp 。  - 在头文件
mydll.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);
- 在源文件
mydll.cpp 输入如下代码
#include "pch.h"
#define BUILD_MYDLL
#include "mydll.h"
#include <iostream>
int convert_array(int* data, int len)
{
for (int i = 0; i < len; i++)
{
std::cout << data[i] << ",";
}
std::cout << std::endl;
int nTotal = 0;
for (int i = 0; i < len; i++)
{
nTotal += data[i];
--data[i];
}
return nTotal;
}
- 右键项目DemoDll,生成,即可生成DemoDll.dll

隐式调用动态库
-
右键DemoDll,添加
→
\rightarrow
→新项目
→
\rightarrow
→控制台应用
→
\rightarrow
→创建DemoInvokeDll 项目。 -
在源文件DemoInvokeDll.cpp 中包含头文件mydll.h ,右键DemoInvokeDll 项目
→
\rightarrow
→配置属性
→
\rightarrow
→C/C++
→
\rightarrow
→常规
→
\rightarrow
→附加包含目录
→
\rightarrow
→新行
→
\rightarrow
→选择动态库目录。  -
右键DemoInvokeDll 项目
→
\rightarrow
→配置属性
→
\rightarrow
→链接器
→
\rightarrow
→输入
→
\rightarrow
→附加依赖项
→
\rightarrow
→输入DemoDll.lib 符号文件
→
\rightarrow
→确定
→
\rightarrow
→应用。  -
再给DemoDll.lib 添加搜索路径,右键DemoInvokeDll 项目
→
\rightarrow
→配置属性
→
\rightarrow
→链接器
→
\rightarrow
→常规
→
\rightarrow
→附加库目录
→
\rightarrow
→编辑
→
\rightarrow
→新行
→
\rightarrow
→选择Debug目录。  -
在源文件DemoInvokeDll.cpp 中编写调用代码。
#include <iostream>
#include "mydll.h"
int main()
{
int arr[] = { 3, 6, 7, 8 };
int nLen = sizeof(arr) / sizeof(int);
int nTotal = convert_array(arr, nLen);
std::cout << "数组元素求和结果:" << nTotal << std::endl;
std::cout << "数组元素新值:" << std::endl;
for (int i = 0; i < nLen; i++)
{
std::cout << arr[i] << ",";
}
return 0;
}
- 右键
DemoInvokeDll 项目
→
\rightarrow
→设为启动项目
→
\rightarrow
→本地Windows调试器,结果如下,成功调用动态库! 
显式调用动态库
- 右键
DllPractice 解决方案
→
\rightarrow
→添加
→
\rightarrow
→新项目
→
\rightarrow
→新建xsInvokeDll 项目。  - 按照代码所示五步,完成动态库调用。
#include <iostream>
#include <windows.h>
typedef int (*LPDO_ARRAY)(int* pArr, int nLen);
int main()
{
HINSTANCE hDll;
LPDO_ARRAY lpDo_array;
hDll = LoadLibrary(L"DemoDll.dll");
if (hDll != NULL)
{
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;
nRet = lpDo_array(nArr, nlen);
std::cout << "返回值:" << nRet << std::endl;
std::cout << "数组新值:";
for (int i = 0; i < nlen; i++)
{
std::cout << nArr[i] << ",";
}
}
FreeLibrary(hDll);
}
}
- 右键
xsInvokeDll 项目
→
\rightarrow
→设为启动项目
→
\rightarrow
→本地Windows调试器,结果如下,成功调用动态库! 
动态库与静态库的区别
参见博客静态连接库、动态连接库、和com组件
显式调用动态库仅需要.dll 文件,而隐式调用动态库需要.dll 、.lib 、.h 三个文件。
参考资料
静态连接库、动态连接库、和com组件 Visual Studio 2019-编写C++动态链接库 Visual Studio 2019-显式调用C++动态库
|