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

本文介绍了如何从零开始编写和链接DLL文件,包括使用GCC和VisualStudio两种方法。在GCC中,涉及了创建头文件、导出函数和编译链接步骤。在VS中,通过创建空项目和设置配置类型为DLL,以及使用LoadLibraryA和GetProcAddress调用DLL函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

gcc编译链接dll文件

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

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

#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

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

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

#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形式

gcc -shared -o mydll.dll mydll.c

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

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

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

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

我们main.exe就会输出

在这里插入图片描述

运用万能的vs来进行编译

首先我们创建一个空项目
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

在main.c里面写

#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文件名称是按照项目名称来的
在这里插入图片描述

在mydll中写

#include <stdio.h>

#ifdef __cplusplus
extern "C"
{
#endif

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

#ifdef __cplusplus
}
#endif

下面在mydll项目右键,点击属性
在这里插入图片描述

将配置类型设置为dll文件

在这里插入图片描述

最后一般生成解决方案

在这里插入图片描述

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

在这里插入图片描述

大功告成

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

将这里调为x86就会生成32位程序了。(x64是生成64位程序)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值