.dll 文件编写和使用
1.基本概念
dll(dynamic-link library),动态链接库,是微软实现共享函数库的一种方式。动态链接,就是把一些常用的函数代码制作成dll文件,当某个程序调用到dll中的某个函数的时候,windows系统才把dll加载到内存中。也就是说当程序需要的时候才链接dll,所以是动态链接。
动态链接的好处是磁盘和内存的消耗减少,这也是dll的最初目的。同时dll也提供了模块化的函数库。不过,dll也有缺点,就是版本冲突,比如不同的应用程序共享同一个dll,而它们需求的是不同的版本,这就会出现矛盾,解决的方法是把不同版本的dll放在不同的文件夹中。
2.dll文件的编写(使用vs2013)
首先新建一个dll项目:

然后添加一个头文件和一个源文件(mydll.h / mydll.cpp)
编写头文件,如下:
#ifndef _MYDLL_H_
#define _MYDLL_H_ #define EXPORT_DLL _declspec(dllexport) extern "C" EXPORT_DLL int add(int a, int b); // 即 int add(int a,int b) #endif
编写源文件:
#include "mydll.h"
int add(int a, int b)
{
return (a + b);
}
编译链接完成后会生成 mydll.dll和mydll.lib,这是最后的目标文件
源文件的编写正常,区别是头文件的编写,要加上 _declspec(dllexport),这样就省去了编写.def文件 ,也可以加上 extern "C" 这样通用性更强,因为C++和C的函数名转换不一样,详细见末尾链接。
3.dll文件的使用
dll文件的使用有两种方法,加载时动态链接和运行时动态链接
3.1.加载时动态链接:
#include <iostream>
using namespace std; #pragma comment(lib,"mydll.lib")
extern "C" _declspec(dllimport) int add(int a, int b); int main()
{
cout << add(, ) << endl;
}
3.2.运行时动态链接(主要使用 LoadLibrary和GetProcAddress):
#include <iostream>
#include <Windows.h>
using namespace std; typedef int(*addfun)(int a, int b); int main()
{
HMODULE hdll = LoadLibrary(LPCWSTR("mydll.dll"));
if (hdll != NULL)
{
addfun add = (addfun)GetProcAddress(hdll, "add");
if (add != NULL)
{
cout << add(, ) << endl;
}
FreeLibrary(hdll);
}
}
4.在python中使用dll
需要安装ctypes
使用方法:

推荐链接:http://www.cnblogs.com/cswuyg/archive/2011/09/30/dll.html
.dll 文件编写和使用的更多相关文章
- DLL DEF文件编写方法 VC++ 调用、调试DLL的方法 显式(静态)调用、隐式(动态)调用
DLL 文件编写方法: 1.建立DLL工程 2.声明.定义要导出的函数 BOOL WINAPI InitDlg( HWND hTabctrl,TShareMem* pTshare,CRect* prc ...
- [DLL] Dynamic link library (dll) 的编写和使用教程
前一阵子,项目里需要导出一个DLL,但是导出之后输出一直不怎么对,改了半天才算改对...读了一些DLL教程,感觉之后要把现在的代码导出,应该还要花不少功夫...下面教程参照我读的3个教程写成,所以内容 ...
- delphi 基础之三 编写和调用dll文件
delphi 编写和调用dll文件 Windows 的执行文件可以划分为两种形式程序和动态连接库 (DLLs).一般程序运行是用.EXE文件,但应用程序有时也可以调用存储在DLL的函数. 在如下几 ...
- VC2010编写Dll文件(转)
源:VC2010编写Dll文件 1. 打开VS2010[Flie / New / Project / Visual C++ / Win32 / Win32 Console Application]在下 ...
- 、Dll文件的编写 调用 说明
1>新建Dll文件TestLib.dll 新建Unit文件U_TestFunc U_TestFunc代码如下: unit U_TestFunc; interface uses //尽可能的少us ...
- Delphi中编写无输出函数名的DLL文件(有点意思)(400多篇博客)
用 Delphi 用长了,总是发现,有些和 MS 不同的地方.例如,MS 的公开库中,常常隐藏了许多重要函数,这些函数在系统中常常有起着非常巨大的作用.一旦知道如何调用,可以给自己的应用程序提供很强的 ...
- C++编写DLL文件
动态链接库DLL文件与EXE文件一样也是可执行文件,但是DLL也被称为库,因为里面封装了各种类.函数之类的东西,就像一个库一样,存着很多东西,主要是用来调用的.调用方式主要分为两种:隐式(通过lib文 ...
- .lib文件 .h文件 .dll文件
.lib代表的是静态数据连接库,在windows系统中起到链接程序和函数的作用,存放的是函数的是函数调用的信息,是obj文件的集合.相当于linux中的.a或.0. .so文件.lib文件是不对外公开 ...
- vs2010下C++调用lib或dll文件
注: DLL:表示链接库,包含dll,lib文件: dll: 表示my.dll文件 lib: 表示my.lib文件 C++ 调用.lib的方法: 一: 隐式的加载时链接,有三种方法 1 设置工程的 ...
随机推荐
- python 写的几道题
''' #乘法口诀''' for i in range(1,10): for j in range(1,i+1): print("%d*%d=%2d" % (i,j,i*j),en ...
- Vue.js组件之同级之间的通信
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- BOM基础(一)
学完了js的基础语法和DOM之后,就要要看看javascript中最后一项BOM了.BOM,全称brower document model,翻译过来就是浏览器对象模型.DOM是文档对象模型,属于BOM ...
- maven新建的项目,不自动引入依赖包
1.检查repository的目录是不是纯英文. 2.重新下载一次repository. 如果解决了问题,那么原因就是前面在加载repository的时候,因为断网导致了下载的包有误,无法被ecl ...
- 初次接触java中的递归算法
一道关于兔子繁衍的编程题: 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 自己考虑了挺久,思路出现了问题,甚至连 ...
- 2761: [JLOI2011]不重复数字(哈希表)
2761: [JLOI2011]不重复数字 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1770 Solved: 675[Submit][Stat ...
- 用Qemu搭建aarch32学习环境
作者信息 作者: 彭东林 邮箱: pengdonglin137@163.com QQ: 405728433 软件平台 主机: Ubuntu14.04 64位版本 模拟器:Qemu-2.8.0 Linu ...
- Solr5.2.1+Zookeeper3.4.8分布式集群搭建
1.选取三台服务器 由于机器比较少,现将zookeeper和solr都部署在以下三台机器上.(以下操作都是在172.16.20.101主节点上进行的哦) 172.16.20.101 主节点 172.1 ...
- malloc函数及用法
动态存储分配在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变.C语言中不允许动态数组类型.例如:int n;scanf("%d",&n);int a[n ...
- css3动画图片波纹效果
这里的图片很有特点,下面有演示图片样式 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...