C语言创建和调用dll动态库

C语言创建和调用dll动态库

前言

C++在调用Dll中的函数的时候,如果是企业内部的话,肯定是希望三件套的方式(.h\.lib\.dll)。这样做的话,编写方可以在头文件中写入很多信息,方便调用方的调用。但是,一旦是给其他公司的人使用,而不想让别人看到的话,那编写方肯定是不想让别人看到过多的信息的,你只管调用。

还有一点是 dll是在调试的时候使用的,lib是编译的时候使用的,两者是不同时期使用的工具

写这个单纯为了我自己理解

1.创建dll

首先创建一个空的DLL文件,创建方法:新建——项目——Win32控制台程序——然后取个名字——确定——下一步——选择DLL——勾选空白项目。顺利新建了名字为Dll1的项目。项目中有这些东西(VS2017)

添加头文件Dll1.h 在头文件中添加导出函数add函数

#pragma once

extern "C" __declspec(dllexport) int add(int a, int b);

//extern "C" 是表示C语言代码,优点通常调用动态库不改变函数名,具体的找相关文献

//_declspec(dllexport) 导出函数,我是这么理解的

现在我们在Dll1.cpp文件中进行实现

#include "Dll1.h"

int add(int a, int b) {

return a + b;

}

然后编译,不过注意平台的设置

(根据需求选择)

/*

x86、x64的区别:

x86平台编译出来的exe(可执行文件)或dll(动态链接库)都是32位的;x64对应的则是64位的。

若你的启动项目,即主程序(编译出来是exe文件的)是x86平台下编译的,而它所依赖的一个项目(或动态链接库)是由x64位平台编译出来的,则会提示“未能加载文件或程序集...或它的某一个依赖性。试图加载格式不正确的程序。”之类的错误。这是因为32位程序不能加载64位的dll,更不能调用其中的类、方法和对象等。反之,若主程序是由x64平台编译出来的,而dll是x86的呢?答案。。也是不行的! ———————————————— 版权声明:本文为CSDN博主「疯子的仰望」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/admainzl/article/details/101850906

*/

尽量和调用方一致嗷,避免白给。

然后点击生成

在x64——deBug目录下 找到Dll1.dll和Dll1.lib。

2.1 调用dll动态库方法一

Dll编写我们算是结束了 接下来需要重新新建一个Win32的控制台程序取名字为Test

先在项目下添加Dll1.dll和Dll1.lib(两个文件必须和软件放在同一文件夹)

然后在Test.cpp中加入以下代码:

//静态调用DLL库的方法

#include

#include

#include

#pragma comment(lib,"Dll1.lib")//表示链接Dll1.lib这个库。

//(注意数字1和字母l)

/*

更多关于#pragma comment()的去看链接

https://blog.csdn.net/weixin_34405925/article/details/86285203?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163913902116780271950822%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163913902116780271950822&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-86285203.first_rank_v2_pc_rank_v29&utm_term=%23pragma+comment&spm=1018.2226.3001.4187

*/

extern "C" __declspec(dllimport) int __stdcall add(int a, int b);

//__declspec(dllimport) 导入包

// 静态调用DLL库

void main()

{

int sum = add(10, 20);

printf("静态调用,sum = %d\n", sum);

}

2.2 调用dll动态库方法二

只用在项目下添加Dll1.dll不需要Dll1.lib

#include

#include

int main()

{

HMODULE h = NULL;//创建一个句柄h

h = LoadLibrary("Dll1.dll");

if (h == NULL)//检测是否加载dll成功

{

printf("加载DLLTest1.dll动态库失败\n");

return -1;

}

typedef int(*AddFunc)(int, int); // 定义函数指针类型

AddFunc add;

// 导出函数地址

add = (AddFunc)GetProcAddress(h, "add");

int sum = add(100, 200);

printf("动态调用的结果%d\n", sum);

return 0;

}

总结:

文章来源于C/C++:Windows编程—调用DLL程序的2种方法_李四老师-CSDN博客_c++ 调用dll

和C/C++写dll文件_Vaxy-CSDN博客_c 写dll

扩展1.Dev c++工具将C代码生成dll文件以及如何调用dll文件_Forward no stop -CSDN博客_devc++ dll

推2.创建动态链接库(dll)_独步天秤的博客-CSDN博客_创建动态链接库

3.C/C++动态链接库(DLL)详解_独步天秤的博客-CSDN博客_c++动态链接库

相关推荐

佳能 70D和佳能 760D有什么区别
365日博官网

佳能 70D和佳能 760D有什么区别

📅 09-29 👁️ 2243
企业签合同一般签几年
盒子365app下载

企业签合同一般签几年

📅 09-20 👁️ 8559
2026年世界杯资格赛新的伊朗国家队名单出笼
365BET体育投注官网

2026年世界杯资格赛新的伊朗国家队名单出笼

📅 07-06 👁️ 2856
电影《狂怒 2003》无删减完整版免费在线观看
365BET体育投注官网

电影《狂怒 2003》无删减完整版免费在线观看

📅 07-23 👁️ 8766
路由器只有一个灯亮是怎么回事
365BET体育投注官网

路由器只有一个灯亮是怎么回事

📅 09-21 👁️ 7327
东京2亿大逃亡后,戈恩发声:我为什么必须逃离日本? 天下网商记者 李丹1月8日,从日本逃离的日产前董事长兼CEO戈恩(Carlos Ghosn)在黎巴嫩举行记者会,公开发声...