当前位置:  编程技术>c/c++/嵌入式

在Visual Studio中用C++语言创建DLL动态链接库图文教程

    来源: 互联网  发布时间:2014-10-29

    本文导语:  什么是DLL(动态链接库)? DLL是一个包含可由多个程序同时使用的代码和数据的库。例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数。因此,每个程序都可以使用该DLL中包含的功能来实现“打开”对话框。...

什么是DLL(动态链接库)?

DLL是一个包含可由多个程序同时使用的代码和数据的库。例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数。因此,每个程序都可以使用该DLL中包含的功能来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。这篇文章的目的就是让你一次性就能了解和掌握DLL。

为什么要使用DLL(动态链接库)?

代码复用是提高软件开发效率的重要途径。一般而言,只要某部分代码具有通用性,就可以将它构造成相对独立的功能模块并在之后的项目中重复使用。比较常见的例子是各种应用程序框架,它们都以源代码的形式发布。由于这种复用是源代码级别的,源代码完全暴露给了程序员,因而称之为“白盒复用”。白盒复用有以下三个缺点:

1.暴露源代码,多份拷贝,造成存储浪费;
2.容易与程序员的本地代码发生命名冲突;
3.更新模块功能比较困难,不利于问题的模块化实现;

为了弥补这些不足,就提出了“二进制级别”的代码复用了。使用二进制级别的代码复用一定程度上隐藏了源代码,对于“黑盒复用”的途径不只DLL一种,静态链接库,甚至更高级的COM组件都是。

使用DLL主要有以下优点:

1.使用较少的资源;当多个程序使用同一函数库时,DLL可以减少在磁盘和物理内存中加载的代码的重复量。这不仅可以大大影响在前台运行的程序,而且可以大大影响其它在Windows操作系统上运行的程序;
2.推广模块式体系结构;
3.简化部署与安装。

创建DLL

打开Visual Studio 2012,创建如下图的工程:

输入工程名字,单击[OK];

单击[Finish],工程创建完毕了。

现在,我们就可以在工程中加入我们的代码了。加入MyCode.h和MyCode.cpp两个文件;在MyCode.h中输入以下代码:

代码如下:

#ifndef _MYCODE_H_
#define _MYCODE_H_
#ifdef DLLDEMO1_EXPORTS
#define EXPORTS_DEMO _declspec( dllexport )
#else
#define EXPORTS_DEMO _declspec(dllimport)
#endif
extern "C" EXPORTS_DEMO int Add (int a , int b);
#endif

在MyCode.cpp中输入以下代码:

代码如下:

#include "stdafx.h"
#include "MyCode.h"
int Add ( int a , int b )
{
       return ( a + b );
}

编译工程,就会生成DLLDemo1.dll文件。在代码中,很多细节的地方,我稍后进行详细的讲解(工程下载)。

使用DLL

当我们的程序需要使用DLL时,就需要去加载DLL,在程序中加载DLL有两种方法,分别为加载时动态链接和运行时动态链接。

1.在加载时动态链接中,应用程序像调用本地函数一样对导出的DLL函数进行显示调用。要使用加载时动态链接,需要在编译和链接应用程序时提供头文件和导入库文件(.lib)。当这样做的时候,链接器将向系统提供加载DLL所需的信息,并在加载时解析导出的DLL函数的位置;

2.在运行时动态链接中,应用程序调用LoadLibrary函数或LoadLibraryEx函数以在运行时加载DLL。成功加载DLL后,可以使用GetProcAddress函数获得要调用的导出的DLL函数的地址。在使用运行时动态链接时,不需要使用导入库文件。

在实际编程时有两种使用DLL的方法,那么到底应该使用那一种呢?在实际开发时,是基于以下几点进行考虑的:

1.启动性能如果应用程序的初始启动性能很重要,则应使用运行时动态链接;
2.易用性在加载时动态链接中,导出的DLL函数类似于本地函数,我们可以方便地进行这些函数的调用;
3.应用程序逻辑在运行时动态链接中,应用程序可以分支,以便按照需要加载不同的模块。

下面,我将分别使用两种方法调用DLL动态链接库。

加载时动态链接:

代码如下:

#include
#include
//#include "..\DLLDemo1\MyCode.h"
using namespace std;
#pragma comment(lib, "..\debug\DLLDemo1.lib")
extern "C" _declspec(dllimport) int Add(int a, int b);
int main(int argc, char *argv[])
{
      cout

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Visual Studio 2012 简体中文版新功能介绍及官方下载地址
  • Visual Studio 的D语言开发插件 Visual D
  • 专门为MinGW所设计的IDE Visual Mingw
  • 微软集成开发环境 Visual Studio
  • 数据库设计和建模工具 DB Visual ARCHITECT
  • node.js Tools for Visual Studio
  • 大家觉得Visual Cafe怎么样?
  • Visual Nunit
  • ?????请问北京哪个书店有Visual age 的书????
  • VISUAL J++在XP上的安装
  • visual age for java 与 webphere studio 的区别?
  • vi 转换成Visual模式!
  • IP识别工具 Visual IP Trace
  • 网页制作工具 Sigma Visual builder
  • 哪位能给个下载visual cafe的网址?
  • Visual Web Page Layouts
  • 请问那里有visual age最新版本是多少?
  • VISUAL J++1.0的程序如何在IE中运行?
  • UML建模工具 Visual Paradigm for UML
  • CMake Tools for Visual Studio
  • JBuiler和Visual Age for Java!




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3