VS2012 创建和使用DLL
来源:互联网 发布:女性就业歧视知乎 编辑:程序博客网 时间:2024/05/25 21:35
1.为什么使用DLL?
我们知道提高开发效率的一个很重要的途径就是代码复用,我们经常将一些常用的功能构造成相对独立的模块,并在之后的项目重复使用,代码复用的方式有两种:
- 白盒复用:如ATL、MFC等,它们都以源代码的形式发布,源代码完全暴露给了程序员。
- 黑盒复用:如Dll,静态链接,com组件等。与白盒复用相比,dll黑盒复用的优势就很明显,dll是二进制文件,
2.如何创建一个DLL项目?
用vs2012创建一个新的Win32 应用控制台程序,名字取为math,要勾选dll选项。如图:
然后新建mymath.h和mymath.cpp文件。
mymath.h如下:
#pragma once#ifdef MATH_EXPORTS#define MATH_API __declspec(dllexport)#else#define MATH_API __declspec(dllimport)#endifnamespace shun{class MATH_API Cmath {//类public:int add(int a,int b);};extern "C" MATH_API float pi;//变量extern "C" MATH_API int getMax(int &,int &);//函数}
mymath.cpp如下:
#include "stdafx.h"#include "mymath.h"namespace shun{float pi=3.1415;//变量int getMax(int& a, int& b) //函数{return a > b ? a : b;}int Cmath::add(int a,int b)//类方法{return a + b;}}
然后生成解决方案,编译成功后可以在debug文件夹下发现math.dll和math.lib文件。
至此,我们已经成功创建一个dll项目了。
3.如何隐式引用一个DLL项目?
隐式调用三要素,.h文件 ,.dll文件,.lib文件,缺一不可。隐式调用的好处是可以像调用本地函数一样方便。
3.1如果项目和dll项目在同一个解决方案
为此我们新建一个win32控制台的空项目,取名useMath,然后引用dll步骤如下:- 项目->属性->通用属性->框架和引用->添加新引用->勾选math项目->确定
- 项目->属性->配置属性->VC++目录->包含目录->添加mymath.h所在的目录
然后添加一个test.cpp文件,输入如下:
#include <iostream> #include "mymath.h"using namespace std; int main(char argc, char**argv) { int a = 1, b = 2;//类的使用shun::Cmath cm;cout<<cm.add(1,2)<<endl; //变量cout<<shun::pi<<endl;//函数cout<<shun::getMax(a,b); getchar(); return 0; }运行一下我们发现调用dll项目了有木有。。
3.2如果项目和dll项目不在同一个解决方案呢?
为此,我们先打开一个新的vs2012,新建一个win32控制台的空项目,取名useMath,然后引用dll步骤如下:- 项目->属性->配置属性->VC++ 目录-> 在“包含目录”里添加头文件mymath.h所在的目录
- 项目->属性->配置属性->VC++ 目录-> 在“库目录”里添加头文件math.lib所在的目录
- 项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里添加“math.lib”(若有多个 lib 则以空格隔开)
- 将dll项目下的debug文件中的math.dll复制到当前项目的debug文件夹中
#include <iostream> #include "mymath.h"using namespace std; int main(char argc, char**argv) { int a = 1, b = 2;//类的使用shun::Cmath cm;cout<<cm.add(1,2)<<endl; //变量cout<<shun::pi<<endl;//函数cout<<shun::getMax(a,b); getchar(); return 0; }
4.如何显示调用dll项目?
显示调用只需要一个dll文件。显示调用好处是模块相对独立,更新非常方便。不好的地方是使用起来稍微复杂。同之前一样,我们新建一个win32控制台项目,然后将math.dll放入debug文件夹中,
因为需要使用到windows api,所以要引入windows.h头文件。
添加test.cpp如下:
#include <windows.h>#include <iostream>using namespace std;typedef int (*Func)(int &, int &);int main(int argc, char *argv[]){int a = 5, b = 10;HMODULE hDll = LoadLibrary("math.dll");if (hDll != NULL){Func getMax = (Func)GetProcAddress(hDll, "getMax");//函数if (getMax != NULL){cout<<getMax(a, b)<<endl;}float* pPi = (float*)GetProcAddress(hDll,"pi");//变量if(pPi != NULL){cout<<*pPi<<endl;}FreeLibrary(hDll);}getchar();}
如果对于函数指针不太熟悉的话可以点这里:函数指针总结
.
//.h文件extern "C" MATH_API int add_Interface(int &,int &);//函数//.cpp文件int add_Interface(int &a,int &b){Cmath cm;return cm.add(a,b);}
然后像上面调用函数一样调用add_Interface。
5.extern "C"作用
我们知道,extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称。比如:
void foo( int x, int y );该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同)。
所以我们可以在函数前使用extern "C"来告诉编译器要采用c编译的方式,而不是c++编译的方式。
1 0
- VS2012 创建和使用DLL
- VS2012创建和使用DLL
- VS2012 创建和使用DLL
- VS2012 创建和使用DLL
- VS2012创建和使用DLL
- vs2012使用向导创建和使用dll
- VS2012下创建和使用DLL (C++)
- vs2012创建dll
- 使用VS2012生成和调用DLL文件
- 创建和使用DLL
- 创建和使用DLL
- VS2012创建DLL动态库
- 用VS2012创建和使用WebService
- c和c++如何使用vs2012生成DLL文件
- 如何正确创建DLL和使用DLL
- 如何正确创建DLL和使用DLL
- 如何正确创建DLL和使用DLL
- VS2010创建DLL和使用DLL
- java 根据url请求别的项目方法
- 【Java概述】【JDK、JRE】【环境变量Path、classpath】【HelloWorld】【注释】
- grunt live reload 配置记录
- Oracle dblink详解(转)
- Error:CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temp
- VS2012 创建和使用DLL
- Wince5内核启动流程
- 关于\r和\n的一些问题总结
- 看看这些图片、这样怎么识别呢?
- mapReduce分组
- Android开发之onClick事件的三种写法
- 天空海阔为了你
- linux编程--gdb调试学习
- 约瑟夫环问题——legend