如何从0到1编写一个dll文件

二木 王者

如何从0到1编写一个dll文件

本人小白一枚,由于刚刚开始接触dll,文件编写,苦于不知道如何进行编写,再加上对工具的不熟悉,查了很久的资料,经过了好几天的摸索,才勉勉强强掌握了一点点怎么写dll文件,这里就记录一下,如何编写我们的dll文件,然后成功的链接到我们的程序中去。

对于编译dll文件,有两种,一种是使用我们强大的环境,vs ,另一种就是使用我们强大的编译器gcc。这里对于这两种方式进行简单的演示。

gcc编译链接dll文件

对于gcc,我们首先写三个文件

一个头文件head.h,这个头文件很有必要,一方面在dll文件中的表明我们要导出哪些函数,在main.c文件中表明dll文件中被导出的文件有哪些。

1
2
3
4
5
6
7
8
9
10
11
#ifdef __cplusplus
extern "C" //指定某个函数按照 C 语言方式编译和链接。在 C++ 中,函数名会被编译器进行名称修饰(name mangling),以支持函数重载和命名空间等特性。而在 C 语言中,函数名没有被修饰
{
#endif

__declspec(dllexport) int add(int a, int b); //导出函数(格式)
//声明了该函数将被导出到 DLL 文件中,以便其他程序可以使用。其它程序可以通过 DLL 导出表来查找这个函数,从而进行调用。

#ifdef __cplusplus
}
#endif

一个要编译成dll的文件,mydll.c

1
2
3
4
5
6
7
#include <stdio.h>
#include"head.h"
//导出函数的实现
int add(int a, int b)
{
return a + b;
}

最后一个我们要执行的程序,main.c

1
2
3
4
5
6
7
8
#include <stdio.h>
#include "head.h"
int main()
{
int a = 10, b = 20;
printf("%d + %d = %d\n", a, b, add(a, b));
return 0;
}

准备工作做完了,开始进行我们的gcc编译

首先,先将我们的mydll.c文件编译成mydll.dll形式

1
gcc -shared -o mydll.dll mydll.c

之后再将dll文件链接到我们的main.c中形成main.exe文件

1
gcc -o main.exe main.c -L . -l mydll

L 表示链接库的目录(这里我们是本目录下,以输入得是 . ),-l(小写L)表示链接库名称(编译器会自动添加.dll或者.so后缀)

这样就完成了我们的dll文件编写与链入

我们main.exe就会输出

Untitled

运用万能的vs来进行编译

首先我们创建一个空项目

Untitled

我们在这个文件下,再创建一个新的项目,用来写我们的dll文件

Untitled

分别创建两个源文件,就先前gcc那样

Untitled

在main.c里面写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include "windows.h"

typedef int(*e_add)(int, int); //定义一个函数指针声明

int main()
{
HMODULE hDll = NULL; //声明一个HMODULE类型(句柄指针)的变量
e_add add1 = NULL; // 声明一个函数指针,用于接收我们的add函数

hDll = LoadLibraryA("mydll.dll"); //加载我们的dll文件,获取导出函数表

if (hDll == NULL) //如果加载dll文件失败,打印提示
{
printf("LoadLibrary(%s) failed!!! [%d]", "mydll", GetLastError());
return;
}

add1 = (e_add)GetProcAddress(hDll, "add"); //获取我们add导出函数的地址

int a = 10, b = 20;
printf("%d + %d = %d\n", a, b, add1(a, b)); //调用函数
return 0;
}

注意这里的名称需要一样,生成的dll文件名称是按照项目名称来的

Untitled

在mydll中写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

#ifdef __cplusplus
extern "C"
{
#endif

__declspec(dllexport) int add(int a, int b) //导出函数
{
return a + b;
}

#ifdef __cplusplus
}
#endif

下面在mydll项目右键,点击属性

Untitled

将配置类型设置为dll文件

Untitled

最后一般生成解决方案

Untitled

找到文件夹执行我们的main.exe文件

Untitled

大功告成

注意:我们函数运用的是win32的函数,因此我们生成的可执行文件也需要是32位文件,因此可能我们需要调整

将这里调为x86就会生成32位程序了。(x64是生成64位程序)

Untitled

 评论