vs2010创建和使用动态链接库(dll)

转载 2013年12月02日 19:55:40

感谢原文作者,地址:http://blog.csdn.net/zddblog/article/details/7352917

本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,并提出了与实现相关的几个问题,供初学者交流。

本文包含以下内容:

创建动态链接库项目

向动态链接库添加类

创建引用动态链接库的应用程序

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

更丰富的simpledll类和相关问题

参考资料

创建动态链接库项目:

1、打开Microsoft Visual Studio 2010,选择File->New->Project

2、在New Project中选择Installed Templates->Visual C++->Win32

3、选择Win32 Console Application,设置名称:simpledll,设置解决方案名:zdddll

4、单击OK,在出现的Win32 Application WizardOverview对话框中点击Next

5、在Application Settings中,选择Application type下的DLL

6、勾选Additional options下的Empty project

7、单击Finish创建项目。

向动态链接库添加类:

1、添加新类头文件。右键单击simpledll项目,Add->New Item,选择Header File(.h),设置名称为simpledll,单击Add

2、添加新类源文件。右键单击simpledll项目,Add->New Item,选择C++ File(.cpp),设置名称为simpledll,单击Add

3、为新类添加内容。内容如下:

头文件simpledll.h:

//------------------ simpledll.h ----------------

#pragma once;

//该宏完成在dll项目内部使用__declspec(dllexport)导出
//在dll项目外部使用时,用__declspec(dllimport)导入
//宏DLL_IMPLEMENT在simpledll.cpp中定义
#ifdef DLL_IMPLEMENT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif

namespace zdd
{
	//导出类
	class DLL_API SimpleDll
	{
	public:
		SimpleDll();
		~SimpleDll();

		int add(int x, int y); //简单方法
	};
}

源文件simpledll.cpp:

//------------------ simpledll.cpp ----------------

//注意此处的宏定义需要写在#include "simpledll.h"之前
//以完成在dll项目内部使用__declspec(dllexport)导出
//在dll项目外部使用时,用__declspec(dllimport)导入
#define DLL_IMPLEMENT 

#include "simpledll.h"

namespace zdd
{
	SimpleDll::SimpleDll()
	{

	}

	SimpleDll::~SimpleDll()
	{

	}

	int SimpleDll::add(int x, int y)
	{
		return x+y;
	}
}

4、完成后点击Build->Build Solution,生成解决方案。可在~zdddll\Debug下查看生成的simpledll.libsimpledll.dll.文件。

创建引用动态链接库的应用程序:

1、选择File->New->Project

2、在New Project中选择Installed Templates->Visual C++->Win32

3、选择Win32 Console Application,设置名称:usesimpledll。选择Add to solution

4、单击OK,在出现的Win32 Application WizardOverview对话框中点击Next

5、在Application Settings中,选择Application type下的Console application

6、取消Additional options下的Precompiled header,勾选Empty project

7、单击Finish创建项目。

在控制台应用程序中使用类库的功能:

1、为控制台应用程序添加main.cpp。右键单击usesimpledll项目,Add->New Item,选择C++ File(.cpp),设置名称为main,单击Add

2、为main.cpp添加内容。如下所示:

//------------------ main.cpp -------------------
#include "simpledll.h"
using namespace zdd;

#include <iostream>
using namespace std;

int main(char argc, char**argv)
{
	//
	cout << "----------------------" <<endl;
	SimpleDll sd;
	cout << "sd.add: 3+5=" << sd.add(3, 5)<<endl;
	cout << "sd.getConst(): "<<sd.getConst()<<endl;

	SimpleDll *psd = new SimpleDll;
	cout << "psd->add: 5+5=" << psd->add(5, 5)<<endl;
	cout << "psd->getConst(): "<<endl;

	cout << "----------------------" <<endl;
	cout << "please press Enter exit."<<endl;
	getchar();
	return 0;
}

3、引用simpledll项目。右键单击usesimpledll项目,选择Properties->Common Properties->Framework and References。点击Add New Reference,选择simpledll项目,单击OK

4、设置头文件路径。选择Properties->Configuration Properties->VC++ Directories。在Include Directories项添加$(SolutionDir)\simpledll\,选择应用,确定。

5、设置usesimpledll项目为活动项目。右键单击usesimpledll项目,选择Set up StartUp Project

6、生成解决方案。Debug运行结果如下:

3+5=8
5+5=10

更丰富的simpledll类和相关问题:

simpledll.h文件:

//------------------ simpledll.h ----------------

#pragma once;

//该宏完成在dll项目内部使用__declspec(dllexport)导出
//在dll项目外部使用时,用__declspec(dllimport)导入
//宏DLL_IMPLEMENT在simpledll.cpp中定义
#ifdef DLL_IMPLEMENT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif

namespace zdd
{
	//导出类
	class DLL_API SimpleDll
	{
	public:
		SimpleDll();
		~SimpleDll();

		int add(int x, int y); //简单方法

		static int sub(int x, int y);//静态方法

		int getConst(); //

		int getNum();

	private:
		void setNum(int n);
		int num;
	};

	//全局变量
	int DLL_API number; 
	SimpleDll DLL_API sdd;

	//对于指针,下面两种用法没区别?
	SimpleDll DLL_API *psdd;
	SimpleDll *psdd1;

	//方法
	int DLL_API Add(int a, int b);

	SimpleDll *createClass()
	{
		return new SimpleDll;
	}

/*
	//问题1:若这样使用,则出现如下错误:
	// error C2059: syntax error : '__declspec(dllexport)'
	// error C2143: syntax error : missing ';' before '{'
	// error : '__declspec(dllimport)'
	// error C2143: syntax error : missing ';' before '{'
	// error C2447: '{' : missing function header (old-style formal list?)
	//为什么?
	SimpleDll* DLL_API createClass1()
	{
		return new SimpleDll;
	}
*/

/*
	//问题2:若这样使用,则出现如下错误:
	//Error	1	error C2491: 'zdd::createClass1' : definition of dllimport function not allowed	usesimpledll
	//为什么?
	SimpleDll DLL_API * createClass2()
	{
		return new SimpleDll;
	}
*/
	//问题3:这样使用(实现在.cpp中),编译没有问题。
	//但在main中应用时回出现以下错误:
	// error LNK2019: unresolved external symbol "class zdd::SimpleDll * __cdecl zdd::createClass3(void)" (?createClass3@zdd@@YAPAVSimpleDll@1@XZ) referenced in function _main
	//该如何解决?
	SimpleDll *createClass3(); //先别这样用

	//全局方法加DLL_API和不加DLL_API时的区别
	int DLL_API getConst1();
	//int getConst2(); //不要这样使用

	//也不要这样用
	//否则当程序发布之后,如果只想通过更新.dll
	//来达到更新程序数据的目的,比如将此处的100更新成10.
	//通过下面的方法你是做不到的
	int getConst2()
	{
		return 100;
//		return 10;
	}

	//也不要这样用,否则将出现如下错误
	//error C2491: 'zdd::getConst3' : definition of dllimport function not allowed
/*
	int DLL_API getConst3()
	{
		return 100;
	}
*/
	//不要这样用,同理
	int others(int a)
	{
		return a+10;
	}
}

simpledll.cpp文件:

//------------------ simpledll.cpp ----------------

//注意此处的宏定义需要写在#include "simpledll.h"之前
//以完成在dll项目内部使用__declspec(dllexport)导出
//在dll项目外部使用时,用__declspec(dllimport)导入
#define DLL_IMPLEMENT 

#include "simpledll.h"

namespace zdd
{
	SimpleDll::SimpleDll()
	{

	}

	SimpleDll::~SimpleDll()
	{

	}

	int SimpleDll::add(int x, int y)
	{
		return x+y;
	}

	int SimpleDll::sub(int x, int y)
	{
		return x-y;
	}

	int SimpleDll::getConst()
	{
		return 10; //
	}

	void SimpleDll::setNum(int n)
	{
		num = n;
	}

	int SimpleDll::getNum()
	{
		return num;
	}

	extern int number = 5;

	int Add(int a, int b)
	{
		return a+b;
	}

	SimpleDll *createClass3()
	{
		return new SimpleDll;
	}

	int getConst1()
	{
		return 100;
		//return 10;
	}
/*
	//error
	extern int getConst2()
	{
		return 100;
	}
*/
}

main.cpp文件:

//------------------ main.cpp -------------------
#include "simpledll.h"
using namespace zdd;

#include <iostream>
using namespace std;

int main(char argc, char**argv)
{
	//
	cout << "----------------------" <<endl;
	SimpleDll sd;
	cout << "sd.add: 3+5=" << sd.add(3, 5)<<endl;
	cout << "sd.getConst(): "<<sd.getConst()<<endl;

	SimpleDll *psd = new SimpleDll;
	cout << "psd->add: 5+5=" << psd->add(5, 5)<<endl;
	cout << "psd->getConst(): "<<endl;

	cout << "----------------------" <<endl;
	cout << "SimpleDll::sub: 2-1=" << SimpleDll::sub(2,1)<<endl;

	cout << "----------------------" <<endl;
	cout << "zdd::number: "<<number<<endl;
	number = 10;
	cout << "changed zdd::number: "<<number<<endl;
	
	cout << "----------------------" <<endl;
	cout << "sdd.add: 6+8=" << sdd.add(6,8)<<endl;
	cout << "psdd->add: 6+8=" <<psdd->add(6,8)<<endl;
	cout << "psdd1->add: 6+8=" <<psdd1->add(6,8)<<endl;

	cout <<endl;
	cout << "sdd.getConst(): "<<sd.getConst()<<endl;
	cout << "psdd.getConst(): "<<psdd->getConst()<<endl;
	cout << "psdd1.getConst(): "<<psdd1->getConst()<<endl;

	cout << "----------------------" <<endl;
	cout << "zdd::Add: 7+8="<<Add(7,8)<<endl;

	cout << "----------------------" <<endl;
	SimpleDll *p = createClass();
	cout << "create->add: 2+3=" <<p->add(3,2)<<endl;
	cout << "create->getConst(): "<<p->getConst()<<endl;
	cout << "----------------------" <<endl;

//	SimpleDll *p3 = createClass3();
//	cout << "create3->add: 2+3=" <<p3->add(3,2)<<endl;
//	cout << "create3->getConst(): "<<p3->getConst()<<endl;
//	cout << "----------------------" <<endl;

	cout << "----------------------" <<endl;
	//请别在你的应用程序中使用getConst2
	cout << "DLL_API getConst1: "<<getConst1()<<endl;
	cout << "        getConst2: "<<getConst2()<<endl;
//	cout << "DLL_API getConst3: "<<getConst3()<<endl;
	cout << "----------------------" <<endl;

//	cout << "others: " << others(6)<<endl;
//	cout << "others: " << others(16)<<endl;
//	cout << "----------------------" <<endl;

	cout << "please press Enter exit."<<endl;
	getchar();
	return 0;
}

运行结果为:

----------------------
sd.add: 3+5=8
sd.getConst(): 10
psd->add: 5+5=10
psd->getConst(): 
----------------------
SimpleDll::sub: 2-1=1
----------------------
zdd::number: 5
changed zdd::number: 10
----------------------
sdd.add: 6+8=14
psdd->add: 6+8=14
psdd1->add: 6+8=14

sdd.getConst(): 10
psdd.getConst(): 10
psdd1.getConst(): 10
----------------------
zdd::Add: 7+8=15
----------------------
create->add: 2+3=5
create->getConst(): 10
----------------------
----------------------
DLL_API getConst1: 100
        getConst2: 100
----------------------
please press Enter exit.

可将生成的可执行文件和应用程序拷出到同一目录下,通过更改方法getConst1,getConst2,体会dllexport和dllimport的作用。
代码中提出的几个问题方法,暂时无解,暂不使用。


教你用MSChart控件绘制正态分布图形

一年多的“潜伏”也算是深资“特务”了,长时间看别人的博客,自己却没有写点东东,对不起那些园中劳碌的人。今天终于可以“洗牌”了做正常劳苦大众。那也得感谢是项目交付期,有了“空挡”可以写点什么,让大家拍砖...
  • dezhen
  • dezhen
  • 2016年06月18日 14:31
  • 1266

手把手教你写C#窗体程序,画出泊松分布、正态分布曲线 函数图像

想要源码的童鞋请在下方留言~~以泊松分布,产生50个随机数,画函数图像为例进行详细描述: 1. 首先打开你的vs2010,建立项目,选择窗体程序,点击确定 将需要的控件从工具箱中拖到窗体,如图所示,...
  • huplion
  • huplion
  • 2017年04月09日 08:50
  • 1085

vs2010创建和使用动态链接库(dll)

vs2010创建和使用动态链接库(dll) ——某一天,我突然发现身边的女生烦我了,于是,我决定开始写程序…… 本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,并...
  • bear_79
  • bear_79
  • 2014年02月09日 15:04
  • 441

vs2010创建和使用动态链接库(dll)

参考他人的基础上自己的总结  一、创建动态链接库项目:  1、打开Microsoft Visual Studio 2010,选择File->New->Project。  2、在New Proje...

vs2010 如何让创建和使用动态链接库(dll)

一、创建动态链接库项目:  1、打开Microsoft Visual Studio 2010,选择File->New->Project。  2、在New Project中选择Installed T...

vs2010创建和使用动态链接库(dll)

vs2010创建和使用动态链接库(dll) ——某一天,我突然发现身边的女生烦我了,于是,我决定开始写程序…… 本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,并...

vs2010创建和使用动态链接库(dll)

参考他人的基础上自己的总结 一、创建动态链接库项目: 1、打开Microsoft Visual Studio 2010,选择File->New->Project。 2、在New...

vs2010创建和使用动态链接库(dll)

本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,并提出了与实现相关的几个问题,供初学者交流。 本文包含以下内容: 创建动态链接库项目 向动态链接库添加类 ...

创建一个动态链接库 (DLL),使用VS2010

在本演练中,您将创建一个动态链接库 (DLL),其中包含可供其他应用程序使用的有用例程。使用 DLL 是一种重用代码的绝佳方式。您不必在自己创建的每个程序中重新实现这些例程,而只需对这些例程编写一次,...

vs2010创建和使用动态链接库(dll)

vs2010创建和使用动态链接库(dll) 本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,并提出了与实现相关的几个问题,供初学者交流。 本文包含以下内容: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vs2010创建和使用动态链接库(dll)
举报原因:
原因补充:

(最多只允许输入30个字)