我们将创建的第一种类型的库是动态链接库 (DLL)。 使用 DLL 是一种重用代码的绝佳方式。 您不必在自己创建的每个程序中重新实现同一例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它们即可。

本演练涵盖以下内容:

  • 创建新的动态链接库 (DLL) 项目。

  • 向动态链接库添加类。

  • 创建引用动态链接库的应用程序。

  • 在控制台应用程序中使用类库的功能。

  • 运行应用程序。

系统必备


本主题假定您具备 C++ 语言的基础知识。 如果您是刚开始学习 C++,建议您参阅 Herb Schildt 编写的“C++ Beginner's Guide”(《C++ 初学者指南》),该书可从http://go.microsoft.com/fwlink/?LinkId=115303 在线获得。

创建新的动态链接库 (DLL) 项目
  1. 从“文件”菜单中,选择“新建”,然后选择“项目…”。

  2. 在“项目类型”窗格中,选择“Visual C++”下的“Win32”。

  3. 在“模板”窗格中,选择“Win32 控制台应用程序”。

  4. 为项目选择一个名称,如 MathFuncsDll,并将其键入“名称”字段。 为解决方案选择一个名称,如 DynamicLibrary,并将其键入“解决方案名称”字段。

  5. 单击“确定”启动 Win32 应用程序向导。 在“Win32 应用程序向导”对话框的“概述”页中,单击“下一步”。

  6. 在“Win32 应用程序向导”中的“应用程序设置”页中,选择“应用程序类型”下的“DLL”(如果可用),或者选择“控制台应用程序”(如果“DLL”不可用)。 某些版本的 Visual Studio 不支持通过使用向导创建 DLL 项目。 您可以稍后对此进行更改,以将项目编译为 DLL。

  7. 在“Win32 应用程序向导”的“应用程序设置”页中,选择“附加选项”下的“空项目”。

  8. 单击“完成”创建项目。

向动态链接库添加类
  1. 若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。 将显示“添加新项”对话框。 在“类别”窗格中,选择“Visual C++”下的“代码”。 在“模板”窗格中选择“头文件(.h)”。 为头文件选择一个名称,如 MathFuncsDll.h,并单击“添加”。 将显示一个空白文件。

  2. 添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。 代码应与以下内容类似:

// MathFuncsDll.h

namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static __declspec(dllexport) double Add(double a, double b); // Returns a - b
static __declspec(dllexport) double Subtract(double a, double b); // Returns a * b
static __declspec(dllexport) double Multiply(double a, double b); // Returns a / b
// Throws DivideByZeroException if b is 0
static __declspec(dllexport) double Divide(double a, double b);
};
}
  1. 请注意此代码方法声明中的 __declspec(dllexport) 修饰符。 这些修饰符使 DLL 能够导出该方法以供其他应用程序使用。 有关更多信息,请参见 dllexport, dllimport

  2. 若要为新类创建源文件,请从“项目”菜单中选择“添加新项…”。 将显示“添加新项”对话框。 在“类别”窗格中,选择“Visual C++”下的“代码”。 在“模板”窗格中,选择“C++ 文件(.cpp)”。 为源文件选择一个名称,如 MathFuncsDll.cpp,并单击“添加”。 将显示一个空白文件。

  3. 在源文件中实现“MyMathFuncs”的功能。 代码应与以下内容类似:

// MathFuncsDll.cpp
// compile with: /EHsc /LD #include "MathFuncsDll.h" #include <stdexcept> using namespace std; namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
} double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
} double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
} double MyMathFuncs::Divide(double a, double b)
{
if (b == 0)
{
throw new invalid_argument("b cannot be zero!");
} return a / b;
}
}
  1. 若要将项目生成为 DLL,请从“项目”菜单中选择 MathFuncsDll“属性...”。 在左窗格中,选择“配置属性”下的“常规”。 在右窗格中,将“配置类型”更改为“动态库(.dll)”。 单击“确定”保存更改。

    注意

    如果您从命令行生成项目,请使用 /LD 编译器选项指定输出文件应为 DLL。 有关更多信息,请参见 /MD、/MT、/LD(使用运行库)

  2. 编译该动态链接库,方法是选择“生成”菜单中的“生成解决方案”。 这样就创建了一个可供其他程序使用的 DLL。 有关 DLL 的详细信息,请参见 DLL

创建引用动态链接库的应用程序
  1. 若要创建将引用并使用刚创建的动态链接库的应用程序,请从“文件”菜单中选择“新建”,然后选择“项目...”。

  2. 在“项目类型”窗格中,选择“Visual C++”下的“Win32”。

  3. 在“模板”窗格中,选择“Win32 控制台应用程序”。

  4. 为项目选择一个名称(如 MyExecRefsDll),并将其键入“名称”字段。 从“解决方案”旁边的下拉列表中选择“添入解决方案”。 这会将新项目添加到该动态链接库所属的同一个解决方案中。

  5. 单击“确定”启动“Win32 应用程序向导”。 在“Win32 应用程序向导”对话框的“概述”页中,单击“下一步”。

  6. 在“Win32 应用程序向导”的“应用程序设置”页中,选择“应用程序类型”下的“控制台应用程序”。

  7. 在“Win32 应用程序向导”的“应用程序设置”页中,清除“附加选项”下的“预编译头”复选框。

  8. 按“完成”创建项目。

在控制台应用程序中使用类库的功能
  1. 创建新的控制台应用程序后,将为您创建一个空程序。 源文件的名称与您在前面为项目选择的名称相同。 在本示例中,名为“MyExecRefsDll.cpp”。

  2. 若要使用在动态链接库中创建的算术例程,则必须引用该库。 若要执行此操作,请在解决方案资源管理器中选择 MyExecRefsDll 项目,然后从“项目”菜单中选择“引用...”。 在“属性页”对话框中,展开“通用属性”节点,选择“框架和引用”,然后选择“添加新引用...”按钮。 有关“引用...”对话框的更多信息,请参见“<Projectname> 属性页”对话框 ->“通用属性”->“框架和引用”

  3. 显示“添加引用”对话框。 此对话框列出了所有可以引用的库。 “项目”选项卡列出了当前解决方案中的所有项目,以及它们包含的所有库。 在“项目”选项卡中,选择 MathFuncsDll。 然后单击“确定”。

  4. 若要引用动态链接库的头文件,必须修改包含目录路径。 为此,请在“属性页”对话框中展开“配置属性”节点,然后展开“C/C++”节点,并选择“常规”。 在“附加包含目录”旁边,键入 MathFuncsDll.h 头文件所在位置的路径。

  5. 可执行文件仅在运行时加载动态链接库。 必须告诉系统在哪里查找“MathFuncsDll.dll”。 您可以通过使用 PATH 环境变量做到这一点。 为此,请在“属性页”对话框中展开“配置属性”节点,并选择“调试”。 在“环境”旁边键入以下内容:PATH=<MathFuncsDll.dll 文件的路径>,其中 <MathFuncsDll.dll 文件的路径> 应替换为 MathFuncsDll.dll 的实际位置。 单击“确定”保存所有更改。

    注意

    如果要从命令行而不是从 Visual Studio 运行可执行文件,则必须在命令提示符处手动更新 PATH 环境变量,如下所示:set PATH=%PATH%;<MathFuncsDll.dll 文件的路径>,其中 <MathFuncsDll.dll 文件的路径> 应替换为 MathFuncsDll.dll 的实际位置。

  6. 现在,可以在应用程序中使用“MyMathFuncs”类了。 使用以下代码替换“MyExecRefsDll.cpp”的内容:

// MyExecRefsDll.cpp
// compile with: /EHsc /link MathFuncsDll.lib #include <iostream> #include "MathFuncsDll.h" using namespace std; int main()
{
double a = 7.4;
int b = 99; cout << "a + b = " <<
MathFuncs::MyMathFuncs::Add(a, b) << endl;
cout << "a - b = " <<
MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
cout << "a * b = " <<
MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
cout << "a / b = " <<
MathFuncs::MyMathFuncs::Divide(a, b) << endl; return 0;
}
  1. 通过从“生成”菜单中选择“生成解决方案”,生成可执行文件。

运行应用程序
    1. 确保选择“MyExecRefsDll”作为默认项目。 在“解决方案资源管理器”中,选择 MyExecRefsDll,然后选择“项目”菜单中的“设为启动项目”。

    2. 若要运行项目,请选择“调试”菜单中的“开始执行(不调试)”。 输出应该与下面的内容类似:

    3. a + b = 106.4 
      a - b = -91.6 
      a * b = 732.6 
      a / b = 0.0747475

http://www.cnblogs.com/rollenholt/archive/2012/04/14/2447017.html

演练:创建和使用动态链接库 (C++)的更多相关文章

  1. 创建和使用动态链接库 (C++)

    创建和使用动态链接库 (C++) 转载:http://msdn.microsoft.com/zh-cn/library/ms235636.aspx 此分步演练演示如何创建用于 C++ 应用的动态链接库 ...

  2. 【转载】创建和使用动态链接库 (C++)

    原文:http://blog.csdn.net/handforcpp/article/details/3478254 也可参考MSDN: 演练:创建和使用动态链接库 (C++) 我们将创建的第一种类型 ...

  3. VS2010创建和调用动态链接库

    当我们开发一个产品的时候,我们并不想把源码公布给对方,除了给对方提供exe可执行文件外,我们还可以生成动态链接库,供程序调用,方便二次开发. 下面我将简单梳理一下如何创建和调用动态链接库,方便大家程序 ...

  4. C++创建和使用动态链接库

    一个简单的动态链接库的生成和调用例子,太过简单,大神请绕道. 一.创建动态链接库 使用vs创建工程选择动态链接库. 在项目中创建源文件和头文件,并在文件中添加以下代码. 在头文件中添加以下代码 // ...

  5. vs2010创建和使用动态链接库(dll)

    本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,并提出了与实现相关的几个问题,供初学者交流. 本文包含以下内容: 创建动态链接库项目 向动态链接库添加类 创建引用动态链接库的 ...

  6. Qt创建和使用动态链接库

    一.创建共享库 1.新其他建项目,选择C++库 2.选择共享库,并取项目名称,单击下一步.这里取名位mylib 3.按默认配置单击下一步至模块选项,选择所需支持的模块.这里勾选Qtcore和QtGui ...

  7. vs2010 C++创建和使用动态链接库(dll)

    一.用C++创建动态链接库项目:  1.打开Microsoft Visual Studio 2010,选择File->New->Project.  2.在NewProject中选择Inst ...

  8. VC++ 6.0如何创建与调用动态链接库

    原文:http://blog.csdn.net/wanghaihao_1/article/details/51098451 1.静态链接库与动态链接库区别: 静态链接库:lib中的指令被直接包含在最终 ...

  9. Windows下VS2013创建与使用动态链接库(.dll)

    一.创建动态链接库文件 ** 1.打开VS2013,选择文件,新建工程  2.选择新建W32控制台应用程序,这里将工程名改为makeDLL  3.在应用程序类型中选择DLL,点击完成  4.完成以上步 ...

随机推荐

  1. .net程序客户端更新方案

    原文:.net程序客户端更新方案 客户端程序一个很大的不便的地方就是程序集更新,本文这里简单的介绍一种通用的客户端更新方案.这个方案依赖程序集的动态加载,具体方案如下: 将程序集存储在一个文件数据库中 ...

  2. form的get与post方式的区别(转)

    form元素的method属性用来指定发送form的http方法 使用get时,form数据集被附加到form元素的action属性所指定的URL后面,仅仅是拼接一个URL,然后直接向服务区请求数据, ...

  3. ANT下载与安装--windows

    原文:ANT下载与安装--windows 1.下载地址 http://ant.apache.org/bindownload.cgi: 2.版本信息 1.10.2 .zip archive  对应jdk ...

  4. ES数据

    通过Elasticsearch使用的你的数据 Elasticsearch 系列导航 elasticsearch 与 elasticsearch-head 的安装 ElasticSearch Index ...

  5. 世界卫生组织(WHO)发出最新警告:埃博拉疫情应急响应

    10月14r日.世界卫生组织(WHO)发出警告:在未来两个月内,西非国家将面对"could face up to 10 thousand new Ebola cases a week wit ...

  6. ashx 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。

    1.点击查看ashx在浏览器中显示的信息 2.自定义协议头 这样问题就搞定了.当然只是我遇到的一种.

  7. uva 11552 Fewest Flops 线性dp

    // uva 11552 Fewest Flops // // 二维线性dp // // 首先,在该块必须是相同的来信.首先记录每块有很多种书 // 称为是counts[i]; // // 订购f[i ...

  8. linux 下Eclipse for C/C++的不常见设置

    设置1:build project的时候,让编译器支持  三字母词. 项目文件右击--> Properties-->C/C++ Build--> Settings 如图设置: 再 C ...

  9. 细数 Windows Phone 灭亡的七宗罪(过程很详细,评论很精彩,但主要还是因为太慢了,生态跟不上,太贪了,厂商不愿意推广)

    曾梦想仗剑走天涯,看一看世界的繁华 年少的心有些轻狂,如今你四海为家 曾让你心疼的姑娘,如今已悄然无踪影 犹记得上大学攒钱买了第一台智能手机Lumia 520时,下载的第一首歌曲<曾经的你> ...

  10. 概率分布的 perplexity

    1. 一种 measurement 信息论中,perplexity is a measurement of how well a probability distribution or probabi ...