VS2012 创建和使用DLL

1.为什么使用DLL?

我们知道提高开发效率的一个很重要的途径就是代码复用,我们经常将一些常用的功能构造成相对独立的模块,并在之后的项目重复使用,代码复用的方式有两种:

  • 白盒复用:如ATL、MFC等,它们都以源代码的形式发布,源代码完全暴露给了程序员。

白盒复用的缺点比较多,暴露源码不说,容易与我们自己的代码产生命名冲突,还有就是更新功能比较麻烦。

  • 黑盒复用:如Dll,静态链接,com组件等。与白盒复用相比,dll黑盒复用的优势就很明显,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)
#endif

namespace 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步骤如下:

  1. 项目->属性->通用属性->框架和引用->添加新引用->勾选math项目->确定
  2. 项目->属性->配置属性->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步骤如下:

  1. 项目->属性->配置属性->VC++ 目录-> 在“包含目录”里添加头文件mymath.h所在的目录
  2. 项目->属性->配置属性->VC++ 目录-> 在“库目录”里添加头文件math.lib所在的目录
  3. 项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里添加“math.lib”(若有多个 lib 则以空格隔开)
  4. 将dll项目下的debug文件中的math.dll复制到当前项目的debug文件夹中

新建然后添加一个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;
}  

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();
}

如果对于函数指针不太熟悉的话可以点这里:函数指针总结

如果要显示调用类的方法的话,可以在dll中写一个函数,由这个函数去调用,比如像这样子:

.

//.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++编译的方式。

时间: 2024-10-07 21:04:12

VS2012 创建和使用DLL的相关文章

关于vs2012解决方案中项目DLL文件引用问题

今天用vs2012建了项目框架,老是出现说解决方案中的项目dll文件不存在,但是我按照路径去找是可以找到这个文件的,也就是说这个文件存在的.我按照引用顺序单个编译每个项目都是成功的,就是当我编译整个解决方案的时候就会报某个项目的dll文件不存在.但是我运行时可以运行的.这种问题还是我第一遇到过.我当时就在想是不是我的项目中出现循环引用了啊,因为这种错误一般情况下是不会出现的,我检查了一下项目架构,的确没有这种低级错误. 出现这种现象后来我想了一会,首先就是出现这样的原因肯定是项目在编译时先后顺序

远程创建线程注入DLL

HANDLE WINAPI CreateRemoteThread(__in HANDLE hProcess,__in LPSECURITY_ATTRIBUTES lpThreadAttributes,__in SIZE_T dwStackSize,__in LPTHREAD_START_ROUTINE lpStartAddress,__in LPVOID lpParameter,__in DWORD dwCreationFlags,__out LPDWORD lpThreadId);hProce

VS2012与VS2015同时安装用VS2012创建MFC程序时弹出编译错误”fatal error C1083: 无法打开包括文件:“mprapidef.h”: No such file or directory”的解决办法

在WIndows 7操作系统上同时安装VS2012与VS2015并用VS2012创建MFC程序时弹出编译错误"fatal error C1083: 无法打开包括文件:"mprapidef.h": No such file or directory"的解决办法: I installed vs2015 and vs2012, then the same problem occurs,however, I find a solution. open visual stud

Vs2012 创建项目失败 未找到与约束ContractName

刚开始使用vs2012的时候,创建项目失败,后来找到原因 ,是KB2840642V2的原因,于是 卸载之.vs正常 昨天 vs自动更新后  vs 创建项目失败,打开项目失败 遂查看 看看昨天 ,vs做了哪些更新 原来还是KB的原因,卸载之 完事 OK

在VS2010中创建并引用dll(C#)

一般情况下,如果在新建或添加时选择“windows应用程序”或“控制台应用程序”时,‎结果都会被编译成exe,而选择“类库”时就会被编译成dll.也可以在项目属性中更改其输出类型,如下图:         下面上一个创建dll并引用的实例.         1.新建一个项目,选择类库,命名DllTest.然后写一个类,里面包含一些方法什么的,为了突出主题,作为例子,我就写了一个简单的类,如下: using System; using System.Collections.Generic; usi

用VS2012创建和使用WebService(连接SQL Server)

1.创建"ASP.NET 空Web应用程序".打开VS2012,选择"文件"=>"新建"=>"项目",弹出"新建项目"窗口:然后,选择"Web"=>"ASP.NET空Web应用程序",可以为新建项目设置"名称"."位置"."解决方案名称",然后点击"确定按钮",就创建了一

使用VS2012的C++生成dll

1,首先,通过File->New Project的方式新建一个工程,打开"New Project"对话框. 2,选择Visual C++语言下的 Win32->Win32Project,如图: 3,选择上一步的确定(OK)后,在向导中选择左侧的'Application Setting"选项卡,选择'Application Type'为'DLL', 'Additional options'为'empty',新建一个空的项目.如图: 4,在这里,将待实现的头文件拷贝到

[ogre] Ogre vs2012创建应用程序

首先明确ogre创建项目有两种方式. ogre 工程向导(需要相应的appwizard 插件类似于qt的addins插件),很可惜我下载的是ogre sdk1.9 ,并没有找到相应的版本,不过找到了一些低版本的ogre所需要的插件地址,希望能给那些有需要的人帮助. 这个是ogre对于qt creator,kdevelop,以及vs2010 2008等的插件地址: https://bitbucket.org/ogreaddons/ogreappwizards/downloads  . 2. c++

Visual Studio 创建和使用dll的方法

DLL是一个包含可由多个程序同时使用的代码和数据的库. DLL文件就是把一些函数导出来,然后在新程序中进行复用的过程. 第一部分:使用Visual Studio 2010进行DLL的制作 生成方法一: 第一步:选择创建win32应用程序 第二步:在弹出的应用程序向导中做出如下选择: 第三步:在头文件添加Demoone.h 代码如下: 1 #ifndef _Demo_H_ 2 #define _Demo_H_ 3 #ifdef LIBDLL 4 #define LIBDLL extern "C&q