动态链接库dll的 静态加载 与 动态加载

转载 2015年11月20日 16:38:38
dll 两种链接方式  : 动态链接和静态链接(链接亦称加载)

动态链接是指在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统中找。  
静态链接就是把所有用到的函数全部链接到exe文件中。
动态链接是只建立一个引用的接口,而真正的代码和数据存放在另外的可执行模块中,在运行时再装入;  
而静态链接是把所有的代码和数据都复制到本模块中,运行时就不再需要库了。
 

1.生成  静态链接库 lib 和动态链接库 dll
 
新建工程 (newdll)  win32项目 ->  dll
添加.h文件 
betabinlib.h

  1. #ifndef BETABINLIB_H  
  2. #define BETABINLIB_H  
  3.    
  4. #ifdef NEWDLL_EXPORTS   //自动添加的宏   右键工程-属性-配置属性-预处理器-..定义  
  5. #define MYDLL_API extern "C" __declspec(dllexport)  
  6. #else  
  7. #define MYDLL_API extern "C" __declspec(dllimport)  
  8. #endif  
  9.    
  10. MYDLL_API int add(int x, int y);  // 必须加前缀  
  11. #endif  

添加.cpp文件  betabinlib.cpp

  1. #include "stdafx.h"  
  2. #include "betabinlib.h"  
  3.    
  4. int add(int x, int y)  
  5. {  
  6.     return x + y;  
  7. }  

编译生成  .dll 和 .lib文件
 
2.使用

(1)dll的静态加载--将整个dll文件 加载到  .exe文件中
特点:程序较大,占用内存较大,但速度较快(免去 调用函数LOADLIB等)
测试:
需要  .lib  和 .dll两个文件     (.lib 做 引导用),.h文件

main.cpp

  1. #include <stdio.h>  
  2. #include "betabinlib.h"  
  3. #include <Windows.h>  
  4. #pragma comment(lib, "newdll.lib")  
  5.    
  6. int main()  
  7. {  
  8.     printf("2 + 3 = %d \n", add(2, 3));  
  9.     return 0;  
  10. }  

(2) dll的动态加载--根据需要加载响应函数,随时可卸载。不会因为找不到dll, 导致程序不能运行(需要自己做判断处理)。

只需要 .lib文件,不需要 .h文件


main.cpp
  1. #include <stdio.h>  
  2. #include <Windows.h>  
  3.    
  4. int main()  
  5. {  
  6.     HINSTANCE h=LoadLibraryA("newdll.dll");  
  7.     typedef int (* FunPtr)(int a,int b);//定义函数指针  
  8.    
  9.     if(h == NULL)  
  10.     {  
  11.     FreeLibrary(h);  
  12.     printf("load lib error\n");  
  13.     }  
  14.     else  
  15.     {  
  16.         FunPtr funPtr = (FunPtr)GetProcAddress(h,"add");  
  17.         if(funPtr != NULL)  
  18.         {  
  19.             int result = funPtr(3, 3);  
  20.             printf("3 + 3 = %d \n", result);  
  21.         }  
  22.         else  
  23.         {  
  24.             printf("get process error\n");  
  25.             printf("%d",GetLastError());  
  26.         }  
  27.         FreeLibrary(h);  
  28.     }  
  29.    
  30.     return 0;  
  31. }  
http://blog.csdn.net/youxin2012/article/details/11538491#comments

main.cpp
  1. #include <stdio.h>  
  2. #include <Windows.h>  
  3.    
  4. int main()  
  5. {  
  6.     HINSTANCE h=LoadLibraryA("newdll.dll");  
  7.     typedef int (* FunPtr)(int a,int b);//定义函数指针  
  8.    
  9.     if(h == NULL)  
  10.     {  
  11.     FreeLibrary(h);  
  12.     printf("load lib error\n");  
  13.     }  
  14.     else  
  15.     {  
  16.         FunPtr funPtr = (FunPtr)GetProcAddress(h,"add");  
  17.         if(funPtr != NULL)  
  18.         {  
  19.             int result = funPtr(3, 3);  
  20.             printf("3 + 3 = %d \n", result);  
  21.         }  
  22.         else  
  23.         {  
  24.             printf("get process error\n");  
  25.             printf("%d",GetLastError());  
  26.         }  
  27.         FreeLibrary(h);  
  28.     }  
  29.    
  30.     return 0;  
  31. }  

DLL的静态加载和动态加载

dll 两种链接方式  : 动态加载和静态加载 动态链接是指在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统中找。...
  • kinocastle
  • kinocastle
  • 2014年10月02日 18:39
  • 578

VC中怎么加载静态和动态链接库

调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同。Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加...
  • woqin1990
  • woqin1990
  • 2014年05月24日 01:54
  • 1517

VB静态调用与动态调用dll详解

【【请注意】】:在以下语法格式中,请注意 [函数名] 的【大小写】!!! 静态与动态比较:     静态调用简单,动态调用麻烦;静态调用占用资源多,动态调用占用资源少;正所谓鱼和熊掌不可兼...
  • sdgaojian
  • sdgaojian
  • 2013年12月23日 17:35
  • 2421

静态链接库(LIB)和动态链接库(DLL),DLL的静态加载和动态加载,两种LIB文件。

静态链接库(LIB)和动态链接库(DLL),DLL的静态加载和动态加载,两种LIB文件。 一、 静态链接库(LIB,也简称“静态库”)与动态链接库(DLL,也简称“动态库”)的区别     静...
  • iw1210
  • iw1210
  • 2014年06月09日 20:39
  • 10318

在VS2010中创建和调用动态链接库和静态链接库

vs2010创建和调用动态链接库和静态链接库
  • yangghuannn
  • yangghuannn
  • 2016年01月13日 09:59
  • 5483

动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)

静态链接库在链接时,编译器会将 .obj 文件和 .LIB 文件组织成一个 .exe 文件,程序运行时,将全部数据加载到内存。 如果程序体积较大,功能较为复杂,那么加载到内存中的时间就会比较长,...
  • shuimanting520
  • shuimanting520
  • 2016年05月07日 07:45
  • 1690

Windows 动态链接库 DLL 浅析

一、概念 DLL:Dynamic Link Library,即动态链接库,这种库包含了可由多个程序同时使用的代码和数据。 它是microsoft在windows操作系统中实现共享函数库概念的一种实现方...
  • heyabo
  • heyabo
  • 2013年03月26日 17:51
  • 27571

Android工程调用第三方动态链接库的方法(静态库同理)

最近在做Android的项目时,需要调用
  • lm_1018784517
  • lm_1018784517
  • 2014年05月30日 17:13
  • 1866

动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)

静态链接库在链接时,编译器会将 .obj 文件和 .LIB 文件组织成一个 .exe 文件,程序运行时,将全部数据加载到内存。 如果程序体积较大,功能较为复杂,那么加载到内存中的时间就会比较长,最...
  • u010154760
  • u010154760
  • 2015年05月13日 10:23
  • 2652

VS2015接口程序调用(静态链接库[.library],动态链接库[.dll])

最近在写接口程序,需要使用外部程序,走了很多弯路,现总结一下,供参考。 一、静态链接库[.library],动态链接库[.dll] 在项目属性中可以看到,配置类型描述了动态库,...
  • BlueCY
  • BlueCY
  • 2017年04月21日 09:36
  • 1749
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态链接库dll的 静态加载 与 动态加载
举报原因:
原因补充:

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