vs2010创建和使用动态链接库(dll)
本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,并提出了与实现相关的几个问题,供初学者交流。
本文包含以下内容:
创建动态链接库项目
向动态链接库添加类
创建引用动态链接库的应用程序
在控制台应用程序中使用类库的功能
更丰富的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 Wizard的Overview对话框中点击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.lib和simpledll.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 Wizard的Overview对话框中点击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的作用。
vs2010创建和使用动态链接库(dll)的更多相关文章
- VS2010创建和调用动态链接库
当我们开发一个产品的时候,我们并不想把源码公布给对方,除了给对方提供exe可执行文件外,我们还可以生成动态链接库,供程序调用,方便二次开发. 下面我将简单梳理一下如何创建和调用动态链接库,方便大家程序 ...
- C# 创建和引入动态链接库dll文件
一.创建动态链接库dll文件 新建 -> 项目->类库 名称为:dlltest 添加函数:消息框弹出消息 using System.Collections.Generic; using S ...
- vs2010 C++创建和使用动态链接库(dll)
一.用C++创建动态链接库项目: 1.打开Microsoft Visual Studio 2010,选择File->New->Project. 2.在NewProject中选择Inst ...
- 创建一个动态链接库 (DLL),使用VS2010
在本演练中,您将创建一个动态链接库 (DLL),其中包含可供其他应用程序使用的有用例程.使用 DLL 是一种重用代码的绝佳方式.您不必在自己创建的每个程序中重新实现这些例程,而只需对这些例程编写一次, ...
- 【转载】创建和使用动态链接库 (C++)
原文:http://blog.csdn.net/handforcpp/article/details/3478254 也可参考MSDN: 演练:创建和使用动态链接库 (C++) 我们将创建的第一种类型 ...
- 演练:创建和使用动态链接库 (C++)
我们将创建的第一种类型的库是动态链接库 (DLL). 使用 DLL 是一种重用代码的绝佳方式. 您不必在自己创建的每个程序中重新实现同一例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它 ...
- VS2010创建动态链接库(DLL)的方法
1.第一步创建WIN32项目,选择DLL 2.第二步,创建你自己的DLL CPP文件和头文件,下面以两个简单的加减法函数为例子导出 然后编译生成即可.DLL文件在Debug或Release目录中 .d ...
- VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性
转自:http://blog.csdn.net/testcs_dn/article/details/27237509 本文将创建一个简单的动态链接库,并编写一个控制台应用程序使用该动态链接库,该动态链 ...
- VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
本文将创建一个简单的动态库-link,谱写控制台应用程序使用该动态链接库,该动态链接库为"JAVA调用动态链接库DLL之JNative学习"中使用的DLL,仅仅是项目及文件名不同. ...
随机推荐
- java strtus2 注解配置入门(一)
因为工作的原因,所以接触到一些项目,有的项目虽然看着能有跟着做,可是具体里面的框架是别人配置的,具体框架还是不是非常的了解,所以这里在看一下我学到的 一点关于struts2中注解开发的一点点. 直接代 ...
- 20160501--struts2入门3
一.自定义拦截器 要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口: public class PermissionInterc ...
- 2013年10月13日学习:SQL通过命令语句来创建表
优点:操作简单,不容易出错,易于调试 缺点:需要记住命令.命令多了就容易混淆,是吧!但是熟悉了时间长了就OK了! step 1. 新建数据库,命名为Test 点击图形化界面中的新建查询,此时就可以输入 ...
- Servlet相关接口和Servlet的生命周期
http://www.cnblogs.com/luotaoyeah/p/3860292.html Servlet相关接口和Servlet的生命周期 创建一个Servlet类最直接的方式是实现javax ...
- (三)映射对象标识符(OID)
所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 第一节:Hibernate 用对象标识符(OID)来区分对象 例子: h ...
- weblogic9.2重置密码
1.删除DefaultAuthenticatorInit.ldift 2.执行命令:java -cp /home/weblogic/bea/weblogic92/server/lib/weblogic ...
- WCF入门及在WinForm中动态调用
一.WCF入门 1. 新建立空白解决方案,并在解决方案中新建项目,项目类型为:WCF服务应用程序,删除系统生成的两个文件IService1.cs与Service1.svc, 添加自定义的WCF[服务文 ...
- javascript格式化指定的日期对象
/* * 格式化Date对象为:“2015-04-17 10:20:00” * var dateObj = new Date(); */ function formartDate(dateObj){ ...
- 用 Python写 daemon
转自 http://chowroc.blogspot.com/2007/05/python-how-to-write-daemon.html 最近用 Python 可能要写 daemon,找资料先看看 ...
- O_NONBLOCK模式下写fifo的注意事项
后台网络通信框架一般采用fifo来作为事件通知的机制:创建一个fifo,然后以非阻塞读和非阻塞写的方式打开fifo,然后把fd加到epoll里面,作为通知网络事件的fd. 在这里有个隐晦的问题容易被忽 ...