在VS2012中采用C++中调用DLL中的函数(4)
转自:http://www.cnblogs.com/woshitianma/p/3683495.html
这两天因为需要用到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“ 创建结束
下面开始 讲述如何向动态链接库中添加类:
- 在菜单栏上:FILE-->NEW-->File,这是会弹出一个对New File话框
- 在左侧窗格中选择Visual C++后,右侧窗格内容会发生变化,在右侧窗格中选择”Header File(.h)“然后选择”Open“
- 出现Header1.h文件,,然后选择常用菜单栏”Save“按钮,将其保存为”AddDLL.h“
- 添加下面代码至”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“错误.
步骤如下:
为了创建一个项目引用你刚刚创建好的DLL,在菜单栏中选择" 文件>新建>项目"
在左窗格中的“Visual C++”下,选择“Win32”。
在中间窗格中,选择“Win32 控制台应用程序”。
在“名称”框中为项目指定名称,例如,testDLL。 从“解决方案”旁边的下拉列表中选择“添加到解决方案”。 这会将新项目添加到包含 AddDLL.DLL 的同一个解决方案中。 选择“确定”按钮。
在“Win32 应用程序向导”对话框的“概述”页上,选择“下一步”按钮。
在“应用程序设置”页上的“应用程序类型”下,选择“控制台应用程序”。
在“应用程序设置”页上的“附加选项”下,清除“预编译头”复选框。
选择“完成”按钮创建项目。
在应用程序中使用类库的功能
在创建一个控制台应用程序后,一个空的程序已经为你创建好了。 源文件的名称与之前选择的名称相同,名为“tesDLL.cpp”。
若要使用您 DLL 中创建的算术例程,必须引用 DLL。 在"Solution Explorer "(解决方案资源管理器)中选择 testDLL 项目,然后在菜单栏上,选择Project-->Reference。 在“testDLL Propeities Pages属性页”对话框中,展开“Commen Propeities通用属性”节点,选择“Framework and Reference 框架和引用”,然后选择“Add New Reference添加新引用”按钮。 有关“引用”对话框的更多信息,请参见“<Projectname> 属性页”对话框 ->“通用属性”->“框架和引用”。
“添加引用”对话框列出了可以引用的库。 “项目”选项卡列出了当前解决方案中的所有项目,以及它们包含的所有库。 在“项目”选项卡上,选中“AddDLL”旁边的复选框,然后选中“确定”按钮。
若要引用 DLL 的头文件,必须修改包含的目录路径。 为此,请在“Propeities Pages属性页”对话框中展开“配置属性”节点,然后展开“C/C++”节点,并选择“General常规”。 在“Addentional Include Directories附加包含目录”旁边,指定AddDLL.h 头文件所在位置的路径。 可以使用相对路径(例如 ..\AddDLL\),然后选择“确定”按钮。
现在即可在此应用程序中使用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,需要有一个 比较细微的设置:
确保选择“testDLl”作为默认项目。 在“解决方案资源管理器”中,选择testDLL,然后在菜单栏上依次选择“项目”、“设为启动项目”。
若要运行项目,请在菜单栏上依次选择“调试”、“开始执行(不调试)”。 控制台输出结果 7.
在VS2012中采用C++中调用DLL中的函数(4)的更多相关文章
- 在VS2012中采用C++中调用DLL中的函数 (4)
这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人 ...
- 【原创】在VS2012中采用C++中调用DLL中的函数(4)
这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人 ...
- 在C++中调用DLL中的函数 (3)
1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...
- 在C++中调用DLL中的函数 (2)
应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息. Visual C++6.0在VC\bin目录下提供了一个名为Dumpbin. ...
- 在C++中调用DLL中的函数
如何在C++中调用DLL中的函数 应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息.Visual C++6.0在VC\bin目录下 ...
- 在C++中调用DLL中的函数(3)
1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...
- 在C++中调用DLL中的函数(2)
本文转自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL ...
- Qt调用dll中的功能函数
声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的.并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下: ...
- 纯静态界面中(html)中通过js调用dll中的方法从数据库中读取数据
最近接到一个离职员工的任务,一个搭好框架的ERP系统,看了两天,说一下看到的东西,整个项目目录中我没发现一个.aspx后缀的文件,全是静态HTML文件,之后发现他用的jquery简直看的头疼,不过大概 ...
随机推荐
- 【iOS开发】获取wifi的SSID
#import <SystemConfiguration/CaptiveNetwork.h> NSArray *ifs = (__bridge_transfer id)CNCopySupp ...
- std::condition_variable
/* std::condition_variable 提供了两种 wait() 函数.当前线程调用 wait() 后将被阻塞(此时当前线程应该获得了锁(mutex),不妨设获得锁 lck),直到另外某 ...
- 【BZOJ4563】[Haoi2016]放棋子 错排+高精度
[BZOJ4563][Haoi2016]放棋子 Description 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍 ...
- 《从零开始学Swift》学习笔记(Day67)——Cocoa Touch设计模式及应用之MVC模式
原创文章,欢迎转载.转载请注明:关东升的博客 MVC(Model-View-Controller,模型-视图-控制器)模式是相当古老的设计模式之一,它最早出现在Smalltalk语言中.现在,很多计算 ...
- 170310、Jenkins部署Maven多环境项目(dev、beta、prod)的参数设置
使用Jenkins配置Git+Maven的自动化构建: http://blog.csdn.net/xlgen157387/article/details/50353317 在一个多开发和生产环境的项目 ...
- Struts2数据验证与使用Java代码进行数据验证
Struts2数据验证 使用Java代码进行数据验证 重写ActionSupport的validate()方法 对Action类的中所有请求处理方法都会进行验证! 对Action类的数据属性进行检查, ...
- SaltStack远程执行-模块
上一篇:SaltStack数据系统-Pillar 执行模块 salt 'linux-node2.example.com' service.status sshd 其中service是模块名称statu ...
- JS获取时间戳+C#水煎戳转换
JS获取了当前毫秒的时间戳. var timestamp=new Date().getTime(); //第二种方法: //var timestamp = (new Date()).valueOf() ...
- Oracle的启动与关闭
启动数据库的前提条件: 环境变量定义好($ORACLE_HOME,$ORACLE_SID,$PATH) 能密码文件认证或OS认证(确保能登入sys) 有正确的参数文件(启动数据库需要查找参数文件,默认 ...
- c++拷贝构造函数,深拷贝,浅拷贝,对象内存
https://blog.csdn.net/lwbeyond/article/details/6202256 防止默认拷贝发生 通过对对象复制的分析,我们发现对象的复制大多在进行“值传递”时发生,这里 ...