这两天因为需要用到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. 云服务设置多台tomcat开机自启动

    紧接此篇文章:http://www.cnblogs.com/leechenxiang/p/7091731.html 1. 修改profile,添加红框内6行代码 vim /etc/profile 代码 ...

  2. Xilinx vivado迅雷下载地址(所有版本)

    注:其实该方法适用于提取Xilinx官网的任意工具的任意版本的迅雷下载地址 ①进入Xilinx官网,进入Device->Design Tools,选择你想要下载的任意工具.②进入新web页面,右 ...

  3. 基于 vue 全家桶的 spa 项目脚手架

    项目简介 Github: https://github.com/hanan198501/vue-spa-template 我们基于 vue-cli 脚手架生成项目模板做了一些改造,加入了 vue-ro ...

  4. IBAction:IBOutlet:注意事项

    1.IBAction: 1> 能保证方法能够连线 > 相当于void 2.IBOutlet: 1> 能保证属性能够连线 3.常见错误 setValue:forUndefinedKey ...

  5. Memory Leak检測神器--LeakCanary初探

      在之前的文章Android内存泄露的几种情形中提到过在开发中常见的内存泄露问题,可是过于草率.因为刚开年,工作还没正式展开,就看了一下Github开源大户Square的LeakCanary,并用公 ...

  6. 支付宝对账单下载Java沙箱调用

    package code; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; impo ...

  7. burpsuite扩展集成sqlmap插件

    通常我们在使用sqlmap测试SQL注入问题的时候会先使用burpsuite来抓包,然后交给sqlmap进行扫描,此操作略显繁琐. 为了避免这种繁琐的重复操作可以将sqlmap以插件的方式集成到bur ...

  8. Android 编程下实现 Activity 的透明效果

    实现方式一(使用系统透明样式) 通过配置 Activity 的样式来实现,在 AndroidManifest.xml 找到要实现透明效果的 Activity,在 Activity 的配置中添加如下的代 ...

  9. MyBatis SqlSessionFactory的几种常见创建方式

    原文链接:https://blog.csdn.net/jimolangge123/article/details/49228255 MyBatis框架主要是围绕着SqlSessionFactory这个 ...

  10. LeetCode: Distinct Subsequences 解题报告

    Distinct Subsequences Given a string S and a string T, count the number of distinct subsequences of  ...