读研时,才接触Visual Studio发开工具。那时,只会通过应用程序来实现一些功能,包括自己的期刊论文中的实验,也是由一个应用程序来实现,整体又长又臭,编译起来很费时。毕业后,进入新能源电池质检行业,因处于图像处理算法岗位,需要实现一些底层的功能,并以动态库的形式提供给第三方调用。由于工作的需要,才开始了解动态库的创建与被调用流程。刚开始的时候,也查阅了很多博客,其中很多都是写得很混乱,阅读起来很费劲,更不用说复现了。不过,也有一些博客也写得挺好的,通过多看几篇优秀的博客,也就搞懂了此流程。在此,将记录下此流程,请各位多多指教 。
一、创建动态库(DLL)
1、步骤一:打开vs2019,选择“创建新项目”;
2、 步骤二:选择“动态链接库”,点击“下一步”;
3、步骤三:按以下的图示,完成新项目配置,最后点击“创建”,这里就完成解决方案的创建;
4、步骤四:添加头文件。选中头文件,点击右键,选中“添加”,最后点击“新建项”;
5、步骤五:按以下图示完成操作。选择头文件,设置头文件名称,点击“添加”;
6、步骤六:添加源文件。选中源文件,点击右键,选中“添加”,这一步和步骤四类似;选择文件,设置文件名称,点击“添加”;
7、步骤7:添加测试代码。dll.h与dll.cpp的代码如下图示;
8、步骤八:设置一下属性。选中工程,右击鼠标;选中属性,右击鼠标;属性页中,在C/C++选项中,选中“预处理器”,最后在“预处理器定义”中加入DLL_EXPORTS。
9、步骤九:重新生成。
二、创建应用程序(EXE)
1、步骤一:选中解决方案,右击鼠标,点击“新建项目”;再添加项目中选中“控制台应用”,最后点击下一步;
2、步骤二:在配置新项目中,设置项目名称,最后点击创建;
三、调用动态库
复制代码进test.cpp,点击运行即可。
四、测试代码
dll.h
#pragma once
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
#include <fstream>
extern "C"
{
DLL_API void print_ok();
};
dll.cpp
#include "pch.h"
#include "dll.h"
#include <iostream>
using namespace std;
DLL_API void print_ok()
{
std::cout << "ok" << endl;
}
test.cpp
#pragma once
#include <iostream>
#include <Windows.h>
using namespace std;
typedef void(*TestDll)();
class Test
{
public:
Test(void);
~Test(void);
int testDll();
private:
HINSTANCE hdll;
TestDll testdll;
};
Test::Test(void)
{
hdll = LoadLibraryA("test_dll.dll");
if (hdll == NULL)
{
FreeLibrary(hdll);
return;
}
testdll= (TestDll)GetProcAddress(hdll, "print_ok");
if (testdll == NULL)
{
FreeLibrary(hdll);
return;
}
}
int Test::testDll()
{
testdll();
return 0;
}
Test::~Test(void)
{
if (hdll)
FreeLibrary(hdll);
}
static Test TD;
int main()
{
int one=TD.testDll();
getchar();
return 0;
}