extern "C" __declspec(dllexport) int Add(int a, int b);
extern __declspec(dllimport) int g_a;
class __declspec(dllexport) Test
public:
Test(int d);
~Test();
public:
int GetData() const;
private:
int data;
Test_Dll.def的文件实现
LIBRARY "Test_Dll"
EXPORTS
g_a DATA
这里写了个函数以示区别。
很多.def有人写的不是DATA而是CONSTANT,其实CONSTANT这个是老式的了。
我们用的CONSTANT关键字,可能调用到的g_a得到的可能是他的地址,而不是变量本身
编译获得Test_Dll.dll和Test_Dll.lib两个文件还有Test_Dll.h头文件
复制到我们要调用的工程下
工程调用.dll使用静态加载的方式去调用
main.cpp文件
#include "Test_Dll.h"
#include <iostream>
using namespace std;
#pragma comment(lib, "Test_Dll")
extern __declspec(dllimport) int g_a;
int main(void)
cout << "Add(10, 30) : " << Add(10, 30) << endl;
cout << "g_a = " << g_a << endl;
Test t(10);
cout << t.GetData() << endl;
return 0;
Test_Dll.h头文件(这里做了一点修改,把extern __declspec(dllexport) int g_a修改成extern __declspec(dllimport) int g_a)
#pragma once
extern "C" __declspec(dllexport) int Add(int a, int b);
extern __declspec(dllimport) int g_a;
class __declspec(dllexport) Test
public:
Test(int d);
~Test();
public:
int GetData() const;
private:
int data;
这个修改是比较重要的,不然的话编译会出错的
最后结果:
函数和类的导出做法是一样的,而全局变量的导出需要.def去解析
全局变量的导出(这里是在windows环境下去讨论这个问题)全局变量的导出与函数的导出并不一样,我们导出全局变量我们必须提供.def的文件去解析 我们这里创建的DLL是Test_DllTest_Dll.cpp的文件实现#include "Test_Dll.h"int g_a = 10;int Add(int a, int b){ return a...
动态链接库(DLL)是一种保存可重用代码的文件格式,它可以在多个应用程序间共享,从而有效地节省系统资源。因此,编写DLL是程序员必备的技能之一。
在编写DLL时,首先需要确定需要导出的函数和变量。导出函数和变量需要使用“__declspec(dllexport)”修饰符,并将它们放在一个.def文件中进行编译。这一步可以通过Visual Studio编译器完成。在编译时,需要将DLL文件作为输出文件类型。
在编写DLL时,需要遵循一定的规范。首先,应该避免使用全局变量,因为它们可能会被多个应用程序共享,导致程序错误。其次,需要确保导出函数和变量的名称在各个应用程序中都是唯一的。此外,应该尽量减少DLL文件的大小,避免占用过多的系统资源。
编写好DLL后,可以通过LoadLibrary函数将其加载到目标应用程序中。这个函数会返回一个模块句柄,可以使用GetProcAdress函数获得DLL中导出函数和变量的地址。然后我们就可以调用这些函数和变量了。
总之,编写动态链接库需要遵循一定的规范,需要明确导出函数和变量的名称和类型,同时需要注意文件的大小和使用范围,只有这样才能编写出优秀的DLL文件,有效地提高程序开发的效率。