一、创建动态链接库
创建Win32项目
- 文件 - 新建 - 项目
- 模板 - Visual C++ - Win32,选择Win32项目,填写名称dlldemo
- 下一步 - 选中DLL - 选中空项目,点击 完成
代码
- 创建头文件 Dlldemo.h
#pragma once;
#ifdef DLLDEMO_EXPORTS
#define DLLDEMO_API __declspec(dllexport)
#else
#define DLLDEMO_API __declspec(dllimport)
#endif
class DLLDEMO_API Dlldemo
{
public:
Dlldemo();
~Dlldemo();
void hello2();
int swap2(int n2);
private:
};
extern "C" DLLDEMO_API void hello();
extern "C" DLLDEMO_API int swap(int n);
- 创建cpp文件 Dlldemo.cpp
#include "Dlldemo.h"
#include <iostream>
using namespace std;
Dlldemo::Dlldemo()
{
}
Dlldemo::~Dlldemo()
{
}
void Dlldemo::hello2()
{
cout << "hello world2========" << endl;
}
int Dlldemo::swap2(int n2)
{
return n2 * n2 * n2;
}
DLLDEMO_API void hello()
{
cout << "hello world" << endl;
}
DLLDEMO_API int swap(int n)
{
return n * n * n;
}
- 创建入口文件 DllMain.cpp
#include <Windows.h>
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
生成动态库
- 选择Release,点击 生成 - 生成解决方案
- Release目录生成.dll和.lib文件
二、调用动态链接库
调用动态库的方式分为隐式调用和显示调用,其中显示调用又分静态调用和动态调用两类。
1.隐式调用
- 创建空项目 dlltest
- 在项目(代码目录)内创建include和lib两个文件夹,include存放.h头文件,lib存放.lib文件,将Dlldemo.h和dlldemo.lib分别放到include和lib目录
- 将dlldemo.dll文件放到Debug目录
- 项目属性 - 配置属性 - C/C++ - 常规 - 附加包含目录 - 选择include目录
- 项目属性 - 配置属性 - 链接器 - 常规 - 附加库目录 - 选择lib目录
- 项目属性 - 配置属性 - 链接器 - 输入 - 附加依赖项 - 加入dlldemo.lib
- 创建main.cpp文件
#include "Dlldemo.h"
#include <iostream>
using namespace std;
int main()
{
Dlldemo *dlldemo = new Dlldemo;
dlldemo->hello2();
int s1 = dlldemo->swap2(4);
cout << "swap 2 is " << s1 << endl;
cout << "========================" << endl;
hello();
int s = swap(2);
cout << "swap 2 is " << s << endl;
return 0;
}
输出结果
hello world2========
swap 2 is 64
======================>==
hello world
swap 2 is 8请按任意键继续…
2.显示调用
2.1静态调用
- 创建空项目dlltest2
- 在项目(代码目录)内创建include和lib两个文件夹,include存放.h头文件,将Dlldemo.h放到include目录
- 将dlldemo.dll文件放到Debug目录
- 创建main.cpp
#include <iostream>
#include "include\Dlldemo.h"
using namespace std;
#pragma comment(lib, "dlldemo.lib")
_declspec(dllimport) int swap(int n);
_declspec(dllimport) void hello();
int main()
{
cout << "swap is " << swap(2) << endl;
hello();
return 0;
}
输出结果:
swap is 8
hello world
请按任意键继续…
2.2动态调用
- 创建空项目 dlltest3
- 将dlldemo.dll文件放到Debug目录
- 创建main.cpp
#include <iostream>
#include <Windows.h>
#include <string.h>
using namespace std;
//1. 声明函数类型
typedef int (*SWAP)(int n);
typedef void(*HELLO)(void);
int main()
{
//2. 获得动态库 hModule
string strPath = "dlldemo.dll";
HMODULE hModule = LoadLibrary(strPath.c_str());
if (hModule == NULL || hModule == INVALID_HANDLE_VALUE)
{
return -1;
}
//3. 获得相关函数
SWAP swap = (SWAP)GetProcAddress(hModule, "swap");
cout << "swap(2) is " << swap(2) << endl;
HELLO hello = (HELLO)GetProcAddress(hModule, "hello");
hello();
FreeLibrary(hModule);
return 0;
}
输出结果:
swap(2) is 8
hello world
请按任意键继续…