在项目开发中,我们经常会使用到动态库(dll),要么是使用别人的动态库,要么是将功能函数封装为动态库给别人用。那么如何封装和使用动态库呢?以下内容为你讲解。

1.动态库的封装

以vs2010为例,我们在创建项目的时候,首先选择win32控制台项目,然后在应用程序设置中选择DLL.如下图:

选择win32控制台项目

选择DLL

然后新建一个头文件,这里取名为 mydll.h,添加如下代码:

#ifndef __MYDLL_H
#define __MYDLL_H
#define DLL_API extern "C" _declspec (dllimport) DLL_API int add(int a,int b); #endif

新建源文件,取名为mydll.c,添加如下代码

#include <stdio.h>
#define DLL_API extern "C" _declspec(dllexport) //注意,这里是export
int add(int a,int b) //api函数
{
return a+b;
}

编译工程,在debug或者release文件夹下会生成*.dll和*.lib文件。至此,动态库封装完成。

2.动态库的使用

将动态库中的*.dll文件,*.lib文件还有*.h文件拷贝至项目工程的主函数文件所在目录下,引用 动态库头文件 并在代码中写上如下 声明

#pragma  comment (lib,"mydll.lib")

该行代码将dll导入到 项目工程中,然后我们就可以调用dll里的函数了。

测试代码如下:

#include "stdio.h"
#include "mydll.h" //引用动态库头文件
#pragma comment (lib,"Dll1.lib") //导入动态库 int main(int argc, int* argv[])
{
int a = 10;
int b = 20;
printf("a+b = %d\n",add(a,b));
system("pause");
return 0;
}

这里需要注意一个问题

在dll中申请的内存,也要在dll中释放

五,动态库(dll)的封装与使用的更多相关文章

  1. Qt编写自定义控件插件开放动态库dll使用(永久免费)

    这套控件陆陆续续完善了四年多,目前共133个控件,除了十几个控件参考网友开源的代码写的,其余全部原创,在发布之初就有打算将动态库开放出来永久免费使用,在控件比较完善的今天抽了半天时间编译了多个qt版本 ...

  2. 在VS2015中用C++编写可被其它语言调用的动态库DLL

    转自:http://blog.csdn.net/songyi160/article/details/50754705 VS2015用C++创建动态库DLL步骤如下: (1)启动VS2015>文件 ...

  3. C++与C#有关对库(动态库dll,静态库.lib)文件的调用

    1 动态库的相互调用 1.1 C#调用C++ dll步骤(只能导出方法): 1. c++建立空项目->源文件文件夹中添加cpp文件和函数 2. c++属性设置中,配置类型设置为动态库dll,公共 ...

  4. Qt生成和调用动态库dll,和静态库.a(windows和linux通用)

    系统1:ThinkPad T570.Windows10.QT5.12.2(Qt Creater 4.8.2)一.动态库.dll的创建和调用1.在qtcreater中按如下步骤创建动态库,动态库名为my ...

  5. C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)

    1. 首先,如何制作一个静态库(lib)? 额, 对于静态库,我们知道,里头是不应该有Main函数,它只是一个配合文件.之所以称之为lib静态库,其实就是指,我们需要用到lib里头的函数时,我们才会去 ...

  6. C#直接使用DllImport调用C/C++动态库(dll文件)

    1.C/C++动态库的编写 下面是我编写的一个比较简单的C++dll文件用来测试,关于如何编写dll文件,我这里便不再赘述,不懂得自行查询, (1).h文件 #ifdef MYDLL_EXPORTS ...

  7. 关于修改动态库DLL的问题

    最近在做一个小软件,需要做到新建.修改动态链接库(DLL)的功能.新建很简单,但是在修改的时候我突然发现问题来了.首先软件会在启动的时候将所有协议加载出来,然后做展示.此时你可以添加或减少动态库中的属 ...

  8. 动态库DLL加载方式-静态加载和动态加载

    静态加载: 如果你有a.dll和a.lib,两个文件都有的话可以用静态加载的方式: message函数的声明你应该知道吧,把它的声明和下面的语句写到一个头文件中 #pragma comment(lib ...

  9. 动态库DLL中类的使用

    一.DLL中类的导出 在类名称前添加 _declspec(dllexport)定义,比如: class _declspec(dllexport) CMath{ .... }; 通常使用预编译开关切换类 ...

随机推荐

  1. UITouch 的主要方法:

    1. UITouch 的主要方法: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesM ...

  2. 动态调整UITableViewCell高度的实现方法

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPa ...

  3. 解决报错:scandir() has been disabled for security reasons

    服务器环境: LNMP 在服务器部署代码时候.遇到了这个问题. 蛋疼啊! 2 解决办法:  打开phpinfo.php , 搜索: scandir 找到disabled_function,确认此函数未 ...

  4. 【BZOJ4556】[Tjoi2016&Heoi2016]字符串 后缀数组+二分+主席树+RMQ

    [BZOJ4556][Tjoi2016&Heoi2016]字符串 Description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一 ...

  5. [XML] CoolFormat

    http://files.cnblogs.com/files/wjs16/CoolFormat3.4.rar

  6. Swift - 点击箭头旋转

    let arrowImage = UIImageView(image: UIImage(named: "Machine_arrow")!.imageWithRenderingMod ...

  7. 微信小程序 --- https请求

    wx.request发起的是 https 请求,而不是 http 请求.一个小程序 同时 只能有 5个 网络请求. 参数: url:开发者服务器接口地址: data:请求的参数: header:设置请 ...

  8. 日期提取函数EXTRACT

    EXTRACT extracts and returns the value of a specified datetime field from a datetime or interval exp ...

  9. maven学习(一)(转)

    我记得在搞懂maven之前看了几次重复的maven的教学视频.不知道是自己悟性太低还是怎么滴,就是搞不清楚,现在弄清楚了,基本上入门了.写该篇博文,就是为了帮助那些和我一样对于maven迷迷糊糊的人. ...

  10. mysql GROUP_CONCAT 用法

    group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) 基本查询 mysql> select * f ...