一、背景

最近在做CANTOUSB底层驱动的调用,是调用别人已经封装好的库,看不到别人写的源程序。程序中调用的是隐式调用即 x.h+x.lib+x.dll,其中DLL即是动态链接库(Dynamic Link Library ),是一种不可执行的二进制程序文件,它允许多个程序共享执行特殊任务所必需的代码和其他资源。DLL提供了一种方法,包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。我也想写写属于自己的DLL,这样方便我在其它项目中调用。后面客户要使用,我也只提供库函数,客户只须去调用函数就行,至于程序中具体如何实现客户无须理解,知道如何调用函数库就好。

二、DLL的生成

新建Win32工程,我是在vs2012环境下创建的,首先在 文件-》新建-》项目...,选择Win32项目,工程名由自己定义。如下图所示:



点击确定之后进入Win32 应用程序向导,如下图所示,应用程序类型选择DLL,附加选项勾选上导出符号,然后完成。



向导完成之后生成如下图所示项目工程,其中我们要实现的函数则在test.cpp中实现,函数声明的则在test.h



首先看下test.h文件,其中CANTOUSB_EXPORTS宏是被我修改过的,修改之后需要在C/C++预处理器中进行更改预处理定义,如下图所示:

#ifdef CANTOUSB_EXPORTS
#define CANTOUSB_API __declspec(dllexport) //制作DLL,将一个函数声名为导出函数,就是说这个函数要被包含她的程序之外的程序调用
#else
#define CANTOUSB_API __declspec(dllimport) //处理类中的静态成员变量的,
#endif // 此类是从 test.dll 导出的
class CANTOUSB_API Ctest {
public:
Ctest(void);
// TODO: 在此添加您的方法。
}; extern CANTOUSB_API int ntest; //声明导出的变量 CANTOUSB_API void Printftest(void); //声明一个打印信息的函数,生成DLL文件之后,在其它的项目只需要包含这个头文件,并调用这个函数就可以。

test.cpp文件

#include "stdafx.h"
#include "test.h"
#include "stdio.h" // 这是导出变量的定义,导出之后可以在其它项目中调用
CANTOUSB_API int ntest=0; // 这是要导出的函数,程序中具体的功能则在函数里边执行,导出函数之后客户看不到这个函数具体的实现方式
CANTOUSB_API void Printftest(void)
{
printf("Creat New Dll"); //打印信息:Creat New Dll
} // 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 test.h
Ctest::Ctest()
{
return;
}

编写完成之后,选择编译类型为:Release,编译并生成 test.dlltest.lib 文件。并将test.h和生成test.lib、test.dll 打包好放一起就可以在其它的项目中调用,这就是一个DLL的创建过程。

三、DLL的调用

新建一个控制台应用程序,工程名为demo,并把 test.dll、test.lib、test.h文件都放到跟新建工程源文件的同一目录下即可使用,并把文件加入到工程中,如下图所示:

看下demo.cpp函数是如何调用库函数:

#include "stdafx.h"
#include "test.h"
#include "stdio.h" int _tmain(int argc, _TCHAR* argv[])
{
Printftest(); //通过test头文件,我知道了Printftest()函数的功能是打印出信息,我只需要去调用就行,至于函数里面怎么实现打印的逻辑对于使用都可以不用管。
return 0;
}

编译执行之后结果是:



输出结果是调用的函数Printftest()中实现的一样:

CANTOUSB_API void Printftest(void)
{
printf("Creat New Dll"); //打印信息:Creat New Dll
}

至此,关于DLL的创建及使用已经学会,开始可以写自己的DLL的,对于调用DLL,使用控制台应用程序或者编写APP程序生成x.exe,调用的DLL文件一定在和x.exe放在一起,否则应用程序无法启动。

by 羊羊得亿

2017-05-18 ShenZhen

动态链接库DLL的创建生成及调用的更多相关文章

  1. VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性

    转自:http://blog.csdn.net/testcs_dn/article/details/27237509 本文将创建一个简单的动态链接库,并编写一个控制台应用程序使用该动态链接库,该动态链 ...

  2. 在Dll中创建对话框并调用

    1.第一步创建一“MFC AppWizard (dll)”工程,接下来选择“Regular Dll using shared MFC DLL”,点击“Finish”. 2.添加一对话框资源到工程中,从 ...

  3. VS2013 C++ 生成与调用DLL(动态链接库) 需要验证

    转载:https://blog.csdn.net/s978697043/article/details/82429802 一.创建动态链接库(生成.dll .lib 两个文件) 文件→新建→项目 选择 ...

  4. 动态链接库的生成(dll)和 动态链接库隐式and显式调用

    一.构建动态链接库(dll.dll dll.lib dll.h) 说明: .dll 是在执行程序是调用  .lib 是在连接程序是调用  .h是在编译程序时调用 1.头文件(声明导入函数):_decl ...

  5. VS2015环境下生成和调用DLL动态链接库

    一.生成动态链接库: 1.打开VS2015->文件->新建->项目->Visual C++->Win32->Win32控制台应用程序->将名称改为dll_ge ...

  6. C#调用C++生成的动态链接库DLL

    一.背景 由于要使用C#写app,所以要把C++生成的DLL在C#中调用,所以就涉及怎样去调用外部的dll问题. 二.C#调用外部DLL 首先先看下C#调用外部DLL的代码 using System. ...

  7. 编译可供C#调用的C/C++动态链接库dll文件

    编译可供C#调用的C/C++动态链接库dll文件,C语言控制台应用程序,探索生成dll过程 由于项目需求,需要公司另一个团队提供相关算法支持,是用C语言编译好的dll库提供给我们进行调用. 但是拿到d ...

  8. ASP.net/C#中如何调用动态链接库DLL

    动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文 ...

  9. C# 创建和引入动态链接库dll文件

    一.创建动态链接库dll文件 新建 -> 项目->类库 名称为:dlltest 添加函数:消息框弹出消息 using System.Collections.Generic; using S ...

随机推荐

  1. 13. Intellij IDEA调试功能使用总结

    转自:https://www.cnblogs.com/Bowu/p/4026117.html 这段时间一直在使用Intellij IDEA, 今天把调试区工具的使用方法记录于此. 先编译好要调试的程序 ...

  2. django 笔记4 数据库操作

    django操作数据库 orm操作 对应关系 models.tb.objects.filter(id__gt=) models.tb.objects.filter(id=) models.tb.obj ...

  3. Oracle 删除重复数据的几种方法

    去重 第一种:distinct create table tmp_t3 as select distinct * from t3; drop table t3; alter table tmp_t2 ...

  4. Ubuntu16.04 “有线未托管”有线网络不可用问题解决

    Ubuntu16.04 “有线未托管”问题解决 电脑上安装的Ubuntu16.04 是通过先安装Ubuntu Server后在通过命令 sudo tasksel 安装的Gnome桌面环境,安装完成后发 ...

  5. 【Redis实现运行状态下切换RDB备份至AOF备份】

    redis持久化方式有哪些?又有何区别? rdb:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能. aof:以追加的方式记录redis操作日志的文件,可最大程度的保证re ...

  6. Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/ma ven/cli/Maven

    安装maven 中出现例如以下异常: Exception in thread "main" java.lang.UnsupportedClassVersionError: org/ ...

  7. 基于SVM的数据分类预測——意大利葡萄酒种类识别

    update:把程序源代码和数据集也附上http://download.csdn.net/detail/zjccoder/8832699 2015.6.24 --------------------- ...

  8. ESP8266学习笔记4:ESP8266的SmartConfig

    今天花了将近一天的时间来研究ESP8266的SmartConfig功能,这个应该算是wifi云产品的标配.这篇文章先把SmartConfig操作一遍,我还写了还有一篇文章梳理了物理层的详细协议,点击这 ...

  9. UDP连接调用connect()函数

    UDP是一个无连接的协议,它没有像TCP中EOF之类的东西. 8.11 UDP的connect函数 除非套接字已连接,否则异步错误是不会反悔到UDP套接字的. 我们确实能够给UDP套接字调用conne ...

  10. webgoat 7.1 实战指南

    WSASP中文文档参考链接: http://www.owasp.org.cn/owasp-project/2017-owasp-top-10 OWASP Top 10 2017中文版V1.3http: ...