这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人Blog在C++中调用DLL中的函数(1)(2)(3)

但是问题出现了,上面讲述的步骤很详细但是在自己运行的时候却会出现错误,于是今天在使用google“vs2012 c++调用dll”时,发现了一篇MSDN上的指南:http://msdn.microsoft.com/zh-cn/library/ms235636.aspx

在这篇指南和之前3篇文章的综合指引下,笔者完成了在VS2012中编写DLL并成功调用DLL的例程,下面将这个过程一步一步详细描述出来:

1、首先,打开VS2012 ,在菜单栏中依次选择:FILE-->NEW-->Project;

2、在 “新建项目”对话框左边窗格中,展开“Installed”-->Templates-->VisualC++ -->Win32”从右侧窗格中选择“Win32 Console Application”(有blog说到Win32Project也可以,笔者未尝试)。

3、在下方窗格“Name”中填写AddDLL(工程名称),“Location”中选择工程的生成目录,Solution中 为“Create new solution”,“Solution name”中填写建立的解决方案的名称“AddDLL” 。确认OK

笔者在此选择工程名称和解决方案名称相同,这样有时会造成误导,所以建议新建工程时注意区分名称。

4、在“win32 application wizard 中“(Win32 应用程序向导)对话框的“概述”页上,选择“next 下一步”按钮。

5、因为需要在这个工程中生成DLL文件,所以需要在右侧窗格中勾选 ”Dll选项“,在”Additional Options“中可以选择

”Precompiled header“和”Security Development Lifecycle(SDL)“选项这样在生成的”AddDLL.cpp“文本中就会出现”#include "stdafx.h"“字样

6、选择”Finish“ 创建结束

下面开始 讲述如何向动态链接库中添加类:

  1. 在菜单栏上:FILE-->NEW-->File,这是会弹出一个对New File话框
  2. 在左侧窗格中选择Visual C++后,右侧窗格内容会发生变化,在右侧窗格中选择”Header File(.h)“然后选择”Open“
  3. 出现Header1.h文件,,然后选择常用菜单栏”Save“按钮,将其保存为”AddDLL.h“
  4. 添加下面代码至”AddDLL.h“文件
// AddDLL.h

#ifdef ADDDLL_EXPORTS
#define ADDDLL_API __declspec(dllexport) 
#else
#define ADDDLL_API __declspec(dllimport) 
#endif

注:当定义了 MATHFUNCSDLL_EXPORTS 符号时,MATHFUNCSDLL_API 符号将在此代码中的成员函数声明中设置 __declspec(dllexport) 修饰符。 此修饰符使函数能作为 DLL 导出,以供其他应用程序调用。 当 MATHFUNCSDLL_EXPORTS 未定义时,MATHFUNCSDLL_API 会在成员函数声明中定义 __declspec(dllimport) 修饰符。 此修饰符能够使编译器优化从 DLL 导入的用于其他应用程序的函数。 默认情况下,生成 MathFuncsDll 项目时会定义 MATHFUNCSDLL_EXPORTS。 有关详细信息,请参阅 dllexport、dllimport

5.在”AddDLL.h“文本中继续填写如下代码,建立名为”MatFuncs“一个基础类,这个基础类中只写了一个算术运算:两个整数相加

namespace MathFuncs

{
    class AddDLL 
    {
    public:
        //returns a+b
        static ADDDLL_EXPORTS_API int Add(int a,int b);     };    //注意:MathFuncclass声明这里;不可少 }

然后在“解决方案资源管理器”的“AddDLL”项目中,在“源文件”文件夹中,打开”AddDLL.cpp“文本,在源文件中实现 MathFuncs 的功能。 代码应类似如下:

#include "stdafx.h"

#include "AddDLL.h"

using namespace std;
namespace MathFuncs
{
    int MathFuncs::Add(int a,int b)
    {
        return a+b;
    }
}

6.在菜单栏中“BUILD -->BUILD Solution (F7)或者Bulid AddDLL“生成解决方案,编译动态链接库,至此DLL已经生成,生成位置在上面几篇文章中有详细讲述,就是在工程目录下的Debug文件夹中

=======================================================================

下面开始创建引用 DLL 的应用程序

引用DLL的程序的工程,可以同编译动态链接库的工程建立在同一个Solution下,也可以不建立在同一个Solution下,不在同一个solution下的方法见文章在C++中调用DLL中的函数(3)

下面讲的是建立在同一个Solution:AddDLL下,在同一个解决方案下时,需要有一个设置,如果不设置,就会导致”Unable to find XXX.DLL“错误.

步骤如下:

  1. 为了创建一个项目引用你刚刚创建好的DLL,在菜单栏中选择" 文件>新建>项目"

  2. 在左窗格中的“Visual C++”下,选择“Win32”。

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

  4. 在“名称”框中为项目指定名称,例如,testDLL。 从“解决方案”旁边的下拉列表中选择“添加到解决方案”。 这会将新项目添加到包含 AddDLL.DLL 的同一个解决方案中。 选择“确定”按钮。

  5. 在“Win32 应用程序向导”对话框的“概述”页上,选择“下一步”按钮。

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

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

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

在应用程序中使用类库的功能

  1. 在创建一个控制台应用程序后,一个空的程序已经为你创建好了。 源文件的名称与之前选择的名称相同,名为“tesDLL.cpp”。

  2. 若要使用您 DLL 中创建的算术例程,必须引用 DLL。 在"Solution Explorer "(解决方案资源管理器)中选择 testDLL 项目,然后在菜单栏上,选择Project-->Reference。 在“testDLL Propeities Pages属性页”对话框中,展开“Commen Propeities通用属性”节点,选择“Framework and Reference 框架和引用”,然后选择“Add New Reference添加新引用”按钮。 有关“引用”对话框的更多信息,请参见“<Projectname> 属性页”对话框 ->“通用属性”->“框架和引用”

  3. “添加引用”对话框列出了可以引用的库。 “项目”选项卡列出了当前解决方案中的所有项目,以及它们包含的所有库。 在“项目”选项卡上,选中“AddDLL”旁边的复选框,然后选中“确定”按钮。

  4. 若要引用 DLL 的头文件,必须修改包含的目录路径。 为此,请在“Propeities Pages属性页”对话框中展开“配置属性”节点,然后展开“C/C++”节点,并选择“General常规”。 在“Addentional Include Directories附加包含目录”旁边,指定AddDLL.h 头文件所在位置的路径。 可以使用相对路径(例如 ..\AddDLL\),然后选择“确定”按钮。

  5. 现在即可在此应用程序中使用MathFuncs 类。 使用以下代码替换“testDll.cpp”的内容:

#include "stdafx.h"#include "AddDLL.h" //在这里需要将本工程的testDLL.h添加到工程中,否则include下会出现红色波浪线#include <iostream> //这里的include <iostream>需要同using name space std配合使用using namespace std;int main(){	int a = 3;	int b = 4;	cout<< MathFuncs::AddDLL::Add(a,b)<<endl;	getchar();//让consol能够保持住窗口}

6.通过在菜单栏上一依次选择“Build --Build testDLL”

下面运行testDLL,需要有一个 比较细微的设置:

  1. 确保选择“testDLl”作为默认项目。 在“解决方案资源管理器”中,选择testDLL,然后在菜单栏上依次选择“项目”、“设为启动项目”。

  2. 若要运行项目,请在菜单栏上依次选择“调试”、“开始执行(不调试)”。 控制台输出结果 7.

【原创】在VS2012中采用C++中调用DLL中的函数(4)的更多相关文章

  1. 在VS2012中采用C++中调用DLL中的函数 (4)

    这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人 ...

  2. 在VS2012中采用C++中调用DLL中的函数(4)

    转自:http://www.cnblogs.com/woshitianma/p/3683495.html 这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天 ...

  3. 在C++中调用DLL中的函数 (3)

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  4. 在C++中调用DLL中的函数 (2)

    应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息. Visual C++6.0在VC\bin目录下提供了一个名为Dumpbin. ...

  5. 在C++中调用DLL中的函数

    如何在C++中调用DLL中的函数 应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息.Visual C++6.0在VC\bin目录下 ...

  6. 在C++中调用DLL中的函数(3)

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  7. 在C++中调用DLL中的函数(2)

    本文转自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL ...

  8. Qt调用dll中的功能函数

    声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的.并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下:   ...

  9. Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤

    原文地址: Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤 - 网络资源是无限的 - 博客频道 - CSDN.NET http://blog.csdn.net/fen ...

随机推荐

  1. mysql获得60天前unix时间示例

    在mysql中获取多少天前的unix时间的方法.首先根据now()获得当前时间,使用adddate()方法获得60天前时间,使用unix_timestamp()方法转换时间类型 select UNIX ...

  2. vue-cli 本地数据模拟

    方法一: 使用express搭建静态服务 mock数据写在json文件中,proxyTable 里将接口代理到具体mock数据json文件上.具体方法: 创建 mock 文件夹 build/dev-s ...

  3. android应用开发-从设计到实现 3-3 Sketch静态原型设计

    Sketch静态原型设计 对于静态原型的设计,我们使用Sketch. 启动Sketch后,我们将看到相似例如以下的界面, 工具栏 它的顶部是工具栏, 能够通过菜单条View -> Customi ...

  4. 菜鸟译文(一)——Java中的继承和组合

    阅读英文的能力对于程序员来说,是很重要的.这几年也一直在学习英文,今天心血来潮,就在网上找了一篇简短的博文翻译一下.水平一般,能力有限,还请各位看官多多指点. 译文: 本文将会举例说明Java中继承和 ...

  5. .NET Core 中读取appsettings.json配置文件的方法

    appsettings.json配置文件结构如下: { "WeChatPay": { "WeChatApp_ID": "wx9999998999&qu ...

  6. ny24 素数距离的问题 筛选法求素数

    素数距离问题时间限制:3000 ms  |  内存限制:65535 KB难度:2 描述    现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度.如果左右有等距离长度素 ...

  7. Android 编程下代码之(QQ消息列表滑动删除)

       这份代码写出来有些时候了,一直没共享,现在把它共享给大家.简单列一下代码中你可以学到的知识点: 自定义控件的实现方式: 事件的拦截分发消费机制: QQ会话列表滑动删除原理: 最后附上源码链接:Q ...

  8. golang遇到的win下读取txt字符乱码的问题

    import ( "encoding/csv" "os" "github.com/axgle/mahonia" ) // GetCSV 读取 ...

  9. elementui常用知识点总结

    1.淡入淡出效果: <transition name="el-fade-in-linear"> <div v-show="show" clas ...

  10. 对jquery新增加的class绑定事件 jquery 对相同class 绑定事件

    当页面加载时,就会注册所有的事件,后面通过jquery新增的内容(<div class="item"></div>),再对新增的添加事件$(".i ...