DLL的静态加载和动态加载
2014-10-02 18:39
387 查看
原文章地址:http://blog.csdn.net/youxin2012/article/details/11538491(有改动)
DLL 两种加载方式 :
动态加载和静态加载
静态加载是指在运行程序之前由操作系统的加载器将DLL和EXE一起加载到内存里。注意这里与程序的静态链接区别开来,静态链接发生在编译过程之中,而DLL的静态加载是发生在程序运行之前
动态加载是指在程序运行过程中程序自己完成对DLL的加载,主要用到LoadLibrary(加载DLL)、GetProcAddress(获得DLL中API函数的地址)FreeLibrary(释放DLL)。我个人认为DLL的动态加载类似于读写文件,只不过文件时被读入文件流中,而DLL中的数据和代码是被读入到相应的数据区和代码区中
1.生成 静态链接库(导入库:用于在 DLL 中找到 API 的入口) lib 和动态链接库
dll
新建工程 (newdll) win32项目 -> dll
添加.h文件
betabinlib.h
[cpp] view
plaincopy
#ifndef BETABINLIB_H
#define BETABINLIB_H
#ifdef NEWDLL_EXPORTS //自动添加的宏 右键工程-属性-配置属性-预处理器-..定义
#define MYDLL_API extern "C" __declspec(dllexport)
#else
#define MYDLL_API extern "C" __declspec(dllimport)
#endif
MYDLL_API int add(int x, int y); // 必须加前缀
#endif
添加.cpp文件 betabinlib.cpp
[cpp] view
plaincopy
#include "stdafx.h"
#include "betabinlib.h"
int add(int x, int y)
{
return x + y;
}
编译生成 .dll 和 .lib(导入库)文件
2.使用
(1)dll的静态加载--将整个dll文件 加载到 .exe文件中
特点:程序较大,占用内存较大,但速度较快(免去 调用函数LOADLIB等)
测试:
需要 .lib 和 .dll两个文件 (.lib 做
引导用),.h文件
main.cpp
[cpp] view
plaincopy
#include <stdio.h>
#include "betabinlib.h"
#include <Windows.h>
#pragma comment(lib, "newdll.lib")
int main()
{
printf("2 + 3 = %d \n", add(2, 3));
return 0;
}
(2) dll的动态加载--根据需要加载响应函数,随时可卸载。不会因为找不到dll, 导致程序不能运行(需要自己做判断处理)。
只需要 .lib文件,不需要 .h文件
main.cpp
[cpp] view
plaincopy
#include <stdio.h>
#include <Windows.h>
int main()
{
HINSTANCE h=LoadLibraryA("newdll.dll");
typedef int (* FunPtr)(int a,int b);//定义函数指针
if(h == NULL)
{
FreeLibrary(h);
printf("load lib error\n");
}
else
{
FunPtr funPtr = (FunPtr)GetProcAddress(h,"add");
if(funPtr != NULL)
{
int result = funPtr(3, 3);
printf("3 + 3 = %d \n", result);
}
else
{
printf("get process error\n");
printf("%d",GetLastError());
}
FreeLibrary(h);
}
return 0;
}
DLL 两种加载方式 :
动态加载和静态加载
静态加载是指在运行程序之前由操作系统的加载器将DLL和EXE一起加载到内存里。注意这里与程序的静态链接区别开来,静态链接发生在编译过程之中,而DLL的静态加载是发生在程序运行之前
动态加载是指在程序运行过程中程序自己完成对DLL的加载,主要用到LoadLibrary(加载DLL)、GetProcAddress(获得DLL中API函数的地址)FreeLibrary(释放DLL)。我个人认为DLL的动态加载类似于读写文件,只不过文件时被读入文件流中,而DLL中的数据和代码是被读入到相应的数据区和代码区中
1.生成 静态链接库(导入库:用于在 DLL 中找到 API 的入口) lib 和动态链接库
dll
新建工程 (newdll) win32项目 -> dll
添加.h文件
betabinlib.h
[cpp] view
plaincopy
#ifndef BETABINLIB_H
#define BETABINLIB_H
#ifdef NEWDLL_EXPORTS //自动添加的宏 右键工程-属性-配置属性-预处理器-..定义
#define MYDLL_API extern "C" __declspec(dllexport)
#else
#define MYDLL_API extern "C" __declspec(dllimport)
#endif
MYDLL_API int add(int x, int y); // 必须加前缀
#endif
添加.cpp文件 betabinlib.cpp
[cpp] view
plaincopy
#include "stdafx.h"
#include "betabinlib.h"
int add(int x, int y)
{
return x + y;
}
编译生成 .dll 和 .lib(导入库)文件
2.使用
(1)dll的静态加载--将整个dll文件 加载到 .exe文件中
特点:程序较大,占用内存较大,但速度较快(免去 调用函数LOADLIB等)
测试:
需要 .lib 和 .dll两个文件 (.lib 做
引导用),.h文件
main.cpp
[cpp] view
plaincopy
#include <stdio.h>
#include "betabinlib.h"
#include <Windows.h>
#pragma comment(lib, "newdll.lib")
int main()
{
printf("2 + 3 = %d \n", add(2, 3));
return 0;
}
(2) dll的动态加载--根据需要加载响应函数,随时可卸载。不会因为找不到dll, 导致程序不能运行(需要自己做判断处理)。
只需要 .lib文件,不需要 .h文件
main.cpp
[cpp] view
plaincopy
#include <stdio.h>
#include <Windows.h>
int main()
{
HINSTANCE h=LoadLibraryA("newdll.dll");
typedef int (* FunPtr)(int a,int b);//定义函数指针
if(h == NULL)
{
FreeLibrary(h);
printf("load lib error\n");
}
else
{
FunPtr funPtr = (FunPtr)GetProcAddress(h,"add");
if(funPtr != NULL)
{
int result = funPtr(3, 3);
printf("3 + 3 = %d \n", result);
}
else
{
printf("get process error\n");
printf("%d",GetLastError());
}
FreeLibrary(h);
}
return 0;
}
相关文章推荐
- VC6 静态与动态加载Dll [示例代码]
- 静态链接与动态加载DLL
- C++如何调用DLL呢,有两种,一种是静态,另外一种是动态,即通过调用windowsAPI 来加载和卸载DLL,具体思路:
- Symbian DLL,Lib(动态加载动态库,静态加载动态库,静态加载静态库)
- [转载] 动态链接库dll的 静态加载 与 动态加载
- 动态加载DLL和静态加载DLL的步骤
- MFC静态加载dll和动态加载dll示例
- Windows用来定位DLL的搜索路径(静态加载和动态加载)
- 静态loaddll的函数改成动态加载,小工具把大量的导出函数处理下
- 动态(静态)加载DLL注意
- 静态加载dll和动态加载dll
- dll库动态加载vs静态加载
- 静态加载dll,动态加载dll及常见问题处理
- 动态链接库dll的 静态加载 与 动态加载
- vc静态加载dll和动态加载dll(转)
- 动态(静态)加载DLL注意
- 动态库DLL加载方式-静态加载和动态加载
- vc静态加载dll和动态加载dll
- 静态链接库(LIB)和动态链接库(DLL),DLL的静态加载和动态加载,两种LIB文件。
- 静态链接库(LIB)和动态链接库(DLL),DLL的静态加载和动态加载,两种LIB文件。