DLL是一个包含可由多个程序同时使用的代码和数据的库。

DLL文件就是把一些函数导出来,然后在新程序中进行复用的过程。

第一部分:使用Visual Studio 2010进行DLL的制作

生成方法一:

第一步:选择创建win32应用程序

第二步:在弹出的应用程序向导中做出如下选择:

第三步:在头文件添加Demoone.h

代码如下:

 #ifndef _Demo_H_
#define _Demo_H_
#ifdef LIBDLL
#define LIBDLL extern "C" _declspec(dllimport)
#else
#define LIBDLL extern "C" _declspec(dllexport)
#endif
LIBDLL int Add(int plus1, int plus2);
#endif

添加Demoone.cpp

代码如下:

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

结构视图如下:

然后点击“生成”下的“生成解决方案”即可

在项目目录下/debug/目录下存在DllDemoone.lib和DllDemoone.dll

生成方法二:

该方法不需要使用_declspec(dllimport)的方式,一二步与上同。

第三步:

Demotwo.h代码如下:

#ifndef _Demo_H_
#define _Demo_H_
extern "C" int Add (int a , int b);
#endif

Demotwo.cpp和上一步骤相同

第四步:

添加def文件:在“添加新建项”中左侧选择“代码”,新建一个模块定义文件,名字随意。它用来创建LIB文件内容如下:

LIBRARY "Dllmaketwo"
EXPORTS
Add @

最终视图如下:

生成解决方案也能得到dll文件。

第二部分:使用dll文件

当我们的程序需要使用DLL时,就需要去加载DLL,在程序中加载DLL有两种方法,分别为加载时动态链接运行时动态链接
在加载时动态链接中,应用程序像调用本地函数一样对导出的DLL函数进行显示调用。要使用加载时动态链接,需要在编译和链接应用程序时提供头文件和导入库文件(.lib)。当这样做的时候,链接器将向系统提供加载DLL所需的信息,并在加载时解析导出的DLL函数的位置;
在运行时动态链接中,应用程序调用LoadLibrary函数或LoadLibraryEx函数以在运行时加载DLL。成功加载DLL后,可以使用GetProcAddress函数获得要调用的导出的DLL函数的地址。在使用运行时动态链接时,不需要使用导入库文件(lib)。
在实际编程时有两种使用DLL的方法,那么到底应该使用那一种呢?在实际开发时,是基于以下几点进行考虑的:
1、启动性能 如果应用程序的初始启动性能很重要,则应使用运行时动态链接;
2、易用性 在加载时动态链接中,导出的DLL函数类似于本地函数,我们可以方便地进行这些函数的调用;
3、应用程序逻辑在运行时动态链接中,应用程序可以分支,以便按照需要加载不同的模块。

方法一:加载时动态链接

新建一个普通控制台项目,将DLLDemoone.lib,DLLDemoone.dll以及Demoone.h复制到和项目代码相同的路径下:

代码按如下方式书写:

#include <iostream>
#include"Demoone.h"//方法a
using namespace std;
#pragma comment(lib, "DLLDemoone.lib")
//extern "C" _declspec(dllimport) int Add(int a, int b);//方法b
int main(int argc, char *argv[])
{
cout<<Add(, )<<endl;
return ;
}

运行即可获得正确的结果。

方法a和方法b是两种不同方式,若使用方法b则不需要拷贝Demo.h这个头文件。

方法二:运行时动态链接

新建一个普通控制台项目,将DLLDemoone.lib,DLLDemoone.dll以及Demoone.h复制到和项目代码相同的路径下:

#include <windows.h>
#include <iostream>
using namespace std;
typedef int (*AddFunc)(int a, int b);
int main(int argc, char *argv[])
{
HMODULE hDll = LoadLibrary("DLLmaketwo.dll");
if (hDll != NULL)
{
AddFunc add = (AddFunc)GetProcAddress(hDll, MAKEINTRESOURCE());
if (add != NULL)
{
cout<<add(, )<<endl;
}
FreeLibrary(hDll);
}
}

在这里会碰到error C2664: “LoadLibraryW”: 不能将参数 1 从“const char *”转换为“LPCWSTR”的问题,解决方式是将工程的字符方式进行修改即可,具体见另一篇:

http://www.cnblogs.com/holyprince/p/4236586.html

创建和使用方法大致分为以上四种,参考了两篇文章,多谢他们:

http://www.jellythink.com/archives/111

http://www.aichengxu.com/view/14438

Visual Studio 创建和使用dll的方法的更多相关文章

  1. Visual Studio 创建代码注释默认模版方法

    在日常的开发中我们经常需要为页面添加注释和版权等信息,这样我们就需要每次去拷贝粘贴同样的文字,为了减少这种重复性的工作,我们可以把这些信息保存在Visual Studio 2012类库模版文件里 1. ...

  2. Visual studio 创建项目失败vstemplate

    Visual studio 创建项目失败 提示 the vstemplate file references the wizard class 'Microsoft.VisualStudio.WinR ...

  3. Visual studio 创建通用项目失败vstemplate

    Visual studio 创建项目失败 提示 the vstemplate file references the wizard class 'Microsoft.VisualStudio.WinR ...

  4. Visual Studio 2008打开vs2010解决方案的方法

    一个朋友遇到了个问题:用visual studio 2008软件,无法打开一个asp.net网站的sln解决方案.如下图,原因是此解决方案由vs2010生成的,必须由vs2010运行程序打开. 这样一 ...

  5. 使用Visual Studio创建简单的自己定义Web Part 部件属性

    使用Visual Studio创建简单的自己定义Web Part 部件属性 自己定义属性使用额外的选项和设置拓展你的Web part部件.本文主要解说怎样使用Visual Studio创建简单的自己定 ...

  6. 用Visual Studio创建集成了gtest的命令行工程

    gtest代码库中的sample代码 在gtest的代码库中,包含了10个sample的代码,覆盖了gtest的常见用法,sample的代码位于以下文件夹: gtest\samples 由于gtest ...

  7. 使用Visual Studio 创建新的Web Part项目

    使用Visual Studio 创建新的Web Part项目 Web Part是你将为SharePoint创建的最常见的对象之中的一个.它是平台构建的核心基块. 1. 管理员身份打开Visual St ...

  8. 使用Visual Studio 创建可视Web Part部件

    使用Visual Studio 创建可视Web Part部件 可视Web Part部件是很强大的Web 部件.它提供内置设计器创建你的用户界面. 本文主要解说怎样使用Visual Studio 创建可 ...

  9. 【翻译】使用Visual Studio创建Asp.Net Core MVC (一)

    This tutorial will teach you the basics of building an ASP.NET Core MVC web app using Visual Studio ...

随机推荐

  1. Immediate Decodability

    Description An encoding of a set of symbols is said to be immediately decodable if no code for one s ...

  2. js正则语法

    整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$".只能输入n位的数字:"^\d{n}$".只能输入至少n位的数 ...

  3. [置顶] 两主机搭建MySQL主从复制后,show slave status显示:Last_IO_Error: error connecting to master ……

    两台主机A.B搭建mysql主从复制关系(A为master,B为slave)后,在slave上执行show slave status,结果中显示Last_IO_Error: error connect ...

  4. php知识(第2天)

    运算符 PHP中运算符一共分为9类: 赋值运算符, 算术运算符,比较运算符, 逻辑运算符, 错误抑制符, 三目运算符, 位运算符, 自操作运算符, 连接操作符 算术运算符 算术运算: 基本运算符: + ...

  5. HTML+CSS笔记 CSS入门

    简介: </span>年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的<span>脚本解释程序</span>,作为ABC语言的一种继承. & ...

  6. 数据结构之后缀数组suffix array

    在字符串处理当中,后缀树和后缀数组都是非常有力的工具,其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料.其实后缀是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多 ...

  7. ORACLE模拟一个数据文件坏块并使用RMAN备份来恢复

    1.创建一个实验用的表空间并在此表空间上创建表 create tablespace blocktest datafile '/u01/oradata/bys1/blocktest.dbf' size ...

  8. Oracle DBA常用的系统表

    1.2 DBA常用的表1.2.1  dba_开头    dba_users数据库用户信息    dba_segments  表段信息    dba_extents    数据区信息    dba_ob ...

  9. poj 2153 Rank List(查找,Map)

    题目链接:http://poj.org/problem?id=2153 思路分析: 判断Li Ming的成绩排名,需要在所有的数据章查找成绩比其高的人的数目,为查找问题. 查找问题可以使用Hash表, ...

  10. 快速注册Uber司机,兼职月入轻松过万

    Uber是世界领先的即时用车网络平台.当前部分中国城市,Uber司机只需每周完成70单,可获得7000元的激励制度回报司机,月收入近3万元.[加入条件]1. 车辆为本地牌照2. 车龄在5年以内3. 裸 ...