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 文件编写和使用的更多相关文章

  1. DLL DEF文件编写方法 VC++ 调用、调试DLL的方法 显式(静态)调用、隐式(动态)调用

    DLL 文件编写方法: 1.建立DLL工程 2.声明.定义要导出的函数 BOOL WINAPI InitDlg( HWND hTabctrl,TShareMem* pTshare,CRect* prc ...

  2. [DLL] Dynamic link library (dll) 的编写和使用教程

    前一阵子,项目里需要导出一个DLL,但是导出之后输出一直不怎么对,改了半天才算改对...读了一些DLL教程,感觉之后要把现在的代码导出,应该还要花不少功夫...下面教程参照我读的3个教程写成,所以内容 ...

  3. delphi 基础之三 编写和调用dll文件

    delphi 编写和调用dll文件   Windows 的执行文件可以划分为两种形式程序和动态连接库 (DLLs).一般程序运行是用.EXE文件,但应用程序有时也可以调用存储在DLL的函数. 在如下几 ...

  4. VC2010编写Dll文件(转)

    源:VC2010编写Dll文件 1. 打开VS2010[Flie / New / Project / Visual C++ / Win32 / Win32 Console Application]在下 ...

  5. 、Dll文件的编写 调用 说明

    1>新建Dll文件TestLib.dll 新建Unit文件U_TestFunc U_TestFunc代码如下: unit U_TestFunc; interface uses //尽可能的少us ...

  6. Delphi中编写无输出函数名的DLL文件(有点意思)(400多篇博客)

    用 Delphi 用长了,总是发现,有些和 MS 不同的地方.例如,MS 的公开库中,常常隐藏了许多重要函数,这些函数在系统中常常有起着非常巨大的作用.一旦知道如何调用,可以给自己的应用程序提供很强的 ...

  7. C++编写DLL文件

    动态链接库DLL文件与EXE文件一样也是可执行文件,但是DLL也被称为库,因为里面封装了各种类.函数之类的东西,就像一个库一样,存着很多东西,主要是用来调用的.调用方式主要分为两种:隐式(通过lib文 ...

  8. .lib文件 .h文件 .dll文件

    .lib代表的是静态数据连接库,在windows系统中起到链接程序和函数的作用,存放的是函数的是函数调用的信息,是obj文件的集合.相当于linux中的.a或.0. .so文件.lib文件是不对外公开 ...

  9. vs2010下C++调用lib或dll文件

    注: DLL:表示链接库,包含dll,lib文件: dll: 表示my.dll文件 lib: 表示my.lib文件 C++ 调用.lib的方法: 一: 隐式的加载时链接,有三种方法 1  设置工程的 ...

随机推荐

  1. ABP Zero源码

    测试运行地址:http://ghy.demo.aspnetzero.com 账号:admin  密码:123456 需要源码,请加QQ:858-048-581 1.先编译成功,Nuget下载ABP的依 ...

  2. AR入门系列-02-Vuforia在Unity3d编辑器的使用

    到unity3d的官网下载 地址:https://store.unity.com/?_ga=1.1496562.231401799.1487590551 个人版功能齐全免费,个人开发者基本够用,本案例 ...

  3. Python字典详解

    转载请注明出处 Python字典(dict)是一个很常用的复合类型,其它常用符合类型有:数组(array).元组(touple)和集合(set).字典是一个key/value的集合,key可以是任意可 ...

  4. MyBatis 的小细节问题

    mybatis Result Maps collection already contains value 这是个小功能,我当时没有怎么在意,后来发到了测试环境的时候测试提出了bug,我才慌忙查看原因 ...

  5. 棋盘覆盖(一) ACM

    棋盘覆盖 描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的2×2方格(图2为其中缺右下角的一个),去覆盖2k×2k未被覆盖过的方格,求 ...

  6. AVFoundation之如何从摄像头获取图像

    前言: 最近项目有个需求是对试图对手机密码进行强破解的人进行拍照(通过摄像头截图),因为之前没做过,所以一堆坑.现在就把我的经验都分享出来,希望后来人不用再踏上坑途中. 直接上代码: // 创建会话 ...

  7. Django REST framework使用ViewSets的自定义路由实现过程

    在Django中使用基于类的视图(ClassView),类中所定义的方法名称与Http的请求方法相对应,才能基于路由将请求分发(dispatch)到ClassView中的方法进行处理,而Django ...

  8. gitignore文件中添加新过滤文件,但是此文件已经提交,如何解决?

    gitignore文件中添加新过滤文件,但是此文件已经提交到远程库,如何解决? 第一步,为避免冲突需要先同步下远程仓库 git pull 第二步,在本地项目目录下删除缓存 git rm -r --ca ...

  9. 腾讯.NET面试题

    在整个面试过程中,作为面试者的你,角色就是小怪兽,面试官的角色则是奥特曼,更不幸的是,作为小怪兽的你是孤身一人,而奥特曼却往往有好几个~ 以下是网友发的关于腾讯的.NET面试题,不得不说还是有一定的难 ...

  10. (20)IO流之SequenceInputStream 序列流

    序列流,对多个流进行合并. SequenceInputStream 表示其他输入流的逻辑串联.它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直 ...