动态链接库DLL的创建生成及调用

一、背景

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

二、DLL的生成

新建Win32工程,我是在vs2012环境下创建的,首先在 文件-》新建-》项目...,选择Win32项目,工程名由自己定义。如下图所示:
1100486-20170518090656525-988031168.png
点击确定之后进入Win32 应用程序向导,如下图所示,应用程序类型选择DLL,附加选项勾选上导出符号,然后完成。
1100486-20170517200922510-690984732.png
向导完成之后生成如下图所示项目工程,其中我们要实现的函数则在test.cpp中实现,函数声明的则在test.h
1100486-20170518091757838-1770942424.png
首先看下test.h文件,其中CANTOUSB_EXPORTS宏是被我修改过的,修改之后需要在C/C++预处理器中进行更改预处理定义,如下图所示:
1100486-20170518093506682-1699506884.png

#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文件都放到跟新建工程源文件的同一目录下即可使用,并把文件加入到工程中,如下图所示:
1100486-20170518102020213-1102351395.png

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

#include "stdafx.h"
#include "test.h"
#include "stdio.h"

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

编译执行之后结果是:
1100486-20170518102626447-918864520.png
输出结果是调用的函数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

转载于:https://www.cnblogs.com/yangxuli/p/6869355.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值