博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VS2010 c++生成和调用dll例子(转载)
阅读量:4653 次
发布时间:2019-06-09

本文共 5123 字,大约阅读时间需要 17 分钟。

一、动态链接库简介

动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库
,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于
一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和
资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。

dll优点和作用:

 

    1、扩展了应用程序的特性;

  2、可以用许多种编程语言来编写;
  3、简化了软件项目的管理;
  4、有助于节省内存;
  5、有助于资源共享;
  6、有助于应用程序的本地化; 

二、创建并使用动态链接库

1.使用_declspec(dllexport)关键字导出函数,使用静态调用dll

    在VisualStudio工程向导中建立一个Windows Console Application,在“应用程序类型”选项中选择DLL,在“附加选项”中选择空项目。如下:

    在项目中添加cpp文件,加入代码如下:

 

[cpp] 
 
 
  1. /**********************************************/  
  2. /*FileName:DllDemo.cpp                        */  
  3. /**********************************************/  
  4.   
  5. #define DllDemoAPI _declspec(dllexport)  
  6. #include "DllDemo.h"  
  7. #include <stdio.h>  
  8.   
  9. DllDemoAPI int add(int a, int b)  
  10. {  
  11.     return a+b;  
  12. }  
  13.   
  14. DllDemoAPI int subtract(int a, int b)  
  15. {  
  16.     return a-b;  
  17. }  
  18.   
  19. DllDemoAPI int multiple(int a, int b)  
  20. {  
  21.     return a*b;  
  22. }  
  23.   
  24. DllDemoAPI void Point::Print(int x, int y)  
  25. {  
  26.     printf("x=%d,y=%d",x,y);  
  27. }  



 

    在项目中添加.h头文件,加入代码如下:

    

 

[cpp] 
 
 
  1. /**********************************************/  
  2. /*FileName:DllDemo.h                          */  
  3. /**********************************************/  
  4.   
  5. #ifdef DllDemoAPI  
  6. #else  
  7. #define DllDemoAPI _declspec(dllimport)  
  8. #endif  
  9.   
  10. DllDemoAPI int add(int a, int b);  
  11. DllDemoAPI int subtract(int a, int b);  
  12. DllDemoAPI int multiple(int a, int b);  
  13.   
  14. class DllDemoAPI Point  
  15. {  
  16. public:  
  17.     void Print(int x, int y);  
  18. };  



 

    编辑,生成,可以看到Debug目录里生成了以下这些文件:

    
    
    调用dll:
    新建一个控制台应用程序,取名InvokeDll,如下图:
    在InvokeDll.cpp中添加以下代码:
    

[cpp] 
 
 
  1. // InvokeDll.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include <Windows.h>  
  6. #include "..\DllDemo\DllDemo.h"  
  7.   
  8. int _tmain(int argc, _TCHAR* argv[])  
  9. {  
  10.     /*加载dll函数调用方式为默认调用方式*/  
  11.        
  12.     printf("5+3=%d\n",add(5,3));   
  13.   
  14.     Point p;  
  15.     p.Print(5,3);  
  16.       
  17.       
  18.     return 0;  
  19. }  



    
    选择InvokeDll项目,点击右键,选择“属性”选项,在“链接”选择的字选项“输入”|“外部依赖项”中添加DemoDll.lib
    
    编译运行得结果:
    

2.通过应用程序定义文件,并动态调用

 

    在VisualStudio工程向导中建立一个Windows Console Application,在“应用程序类型”选项中选择DLL,在“附加选项”中选择空项目。

    在项目中添加cpp文件,加入代码如下:

 

[cpp] 
 
 
  1. /**********************************************/  
  2. /*FileName:DllDemo.cpp                        */  
  3. /**********************************************/  
  4.   
  5. #define DllDemoAPI _declspec(dllexport)  
  6. #include "DllDemo.h"  
  7. #include <stdio.h>  
  8.   
  9. DllDemoAPI int add(int a, int b)  
  10. {  
  11.     return a+b;  
  12. }  
  13.   
  14. DllDemoAPI int subtract(int a, int b)  
  15. {  
  16.     return a-b;  
  17. }  
  18.   
  19. DllDemoAPI int multiple(int a, int b)  
  20. {  
  21.     return a*b;  
  22. }  



    在项目中添加.def头文件,加入代码如下:

 

 

[cpp] 
 
 
  1. LIBRARY DllDemo  
  2.   
  3. EXPORTS  
  4. add  
  5. subtract  
  6. multiple  


    

 

    编辑,生成,可以看到Debug目录里生成了以下这些文件:

    
    
    调用dll:
    同上,新建一个控制台应用程序,取名InvokeDll
    在InvokeDll.cpp中添加以下代码:
    
    

[cpp] 
 
 
  1. #include "stdafx.h"  
  2. #include <Windows.h>   
  3.   
  4. int _tmain(int argc, _TCHAR* argv[])  
  5. {  
  6.     /*加载dll函数调用方式为默认调用方式*/  
  7.     HINSTANCE hInst = LoadLibrary(L"DllDemo.dll");  
  8.     if(!hInst)  
  9.     {  
  10.         printf("加载MathFuns.dll失败!\n");  
  11.     }  
  12.     typedef int (*DllDemoAPIProc)(int a, int b);  
  13.     DllDemoAPIProc Add = (DllDemoAPIProc)::GetProcAddress(hInst,"add");  
  14.     printf("5+3=%d\n",Add(5,3));  
  15.     ::FreeLibrary(hInst);  
  16.       
  17.       
  18.     return 0;  
  19. }  



      
    编译运行得结果:

 

 

下载示例源代码

参考  

c++新手 
一、DLL简介 
包含能被可执行程序或其他DLL调用的函数。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。 
若要访问dll中的函数,该函数必须是导出的(_declspec(dllexport)关键字),在命令提示符下使用dumpbin函数查看导出情况。

二、DLL的2中加载方式:隐式连接和显示加载。

1.隐式连接 

生成dll 
使用_declspec(dllexport)关键字导出函数,使用静态调用dll 
VS2010中新建控制台程序,在“应用程序设置”页面的“应用程序类型”下,选择“DLL”和空项目。 
创建头文件,命名为DllDemo.h

/**********************************************/      /*FileName:DllDemo.h                          */      /**********************************************/      #ifdef DllDemoAPI      #else      #define DllDemoAPI _declspec(dllimport)      #endif      DllDemoAPI int add(int a, int b);      DllDemoAPI int subtract(int a, int b);      DllDemoAPI int multiple(int a, int b);      class DllDemoAPI Point      {      public:          void Print(int x, int y);      };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

创建源文件,命名为DllDemo.cpp

/**********************************************/      /*FileName:DllDemo.cpp                        */      /**********************************************/      #define DllDemoAPI _declspec(dllexport)      #include "DllDemo.h"      #include 
DllDemoAPI int add(int a, int b) { return a+b; } DllDemoAPI int subtract(int a, int b) { return a-b; } DllDemoAPI int multiple(int a, int b) { return a*b; } DllDemoAPI void Point::Print(int x, int y) { printf("x=%d,y=%d",x,y); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

生成,Debug目录里生成了以下这些文件 

这里写图片描述

调用dll 

新建控制台应用程序InvokeDll,默认即可。 
InvokeDll.cpp中添加如下代码:

// InvokeDll.cpp : 定义控制台应用程序的入口点。      //      #include "stdafx.h"      #include 
#include "F:\PCLBOOK\DllDemo\DllDemo\DllDemo.h" int _tmain(int argc, _TCHAR* argv[]) { /*加载dll函数调用方式为默认调用方式*/ printf("5+3=%d\n",add(5,3)); Point p; p.Print(5,3); system("pause"); return 0; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

右键InvokeDll项目,选择“属性”选项,在“链接器”选择的字选项“输入”|“外部依赖项”中添加DemoDll.lib 

编译运行得结果 
这里写图片描述

错误提示: 

1、这里写图片描述 
项目–属性–清单工具–输入输出–嵌入式菜单–将是改成否即可。 
2、error LNK1104: 无法打开文件“DllDemo.lib” 
在“属性”-》链接器-》常规-》附加库目录 和“属性”-》链接器-》输入-》附加依赖项 中都添加上了Dll1.lib库文件的完整路径如“F:\PCLBOOK\DllDemo\Debug\DllDemo.lib”后就成功了。

转载于:https://www.cnblogs.com/Joetao/articles/8438947.html

你可能感兴趣的文章
大数据——大价值、大机遇、大变革(全彩)
查看>>
常用SQL查询语句
查看>>
SQLiteOpenHelper类
查看>>
补充[BNDSOJ]小p的数列
查看>>
EhCache Monitor的使用
查看>>
UVa 541 Error Correction
查看>>
读APUE分析散列表的使用
查看>>
解决文件上传时,服务器中中文文件名乱码问题
查看>>
XPATH如何选择,t选取,包含某一属性的节点, 不包含某一个属性的节点?
查看>>
hihoCoder #1110 Regular Expression
查看>>
jquery选中checkbox多选项并添加到文本框中
查看>>
视频会议软件能否采用免费的商业模式
查看>>
Gridview用法大总结(蛇年珍藏版)
查看>>
CI框架后台添加左侧导航栏出现的一系列问题
查看>>
cocos2d-js 运行动画
查看>>
1.基础知识
查看>>
[NOI2018]你的名字
查看>>
关于mysql中select * for update锁表与Deadlock found when trying to get lock; try restarting transaction...
查看>>
[uva 1350]数位dp+二分
查看>>
使用Gitosis搭建Git服务器
查看>>