学习DLL

来源:互联网 发布:记录生活的软件 编辑:程序博客网 时间:2024/06/05 20:41
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#ifndef _GAME_TOOLS_H_#define _GAME_TOOLS_H_//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#ifdef _cplusplusextern "C"{#endif ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void WINAPI Game_RandomInit(UINT uSeed);INT WINAPI Game_RandomNumber();///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#ifdef _cplusplus}#endif//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#endif //_GAME_TOOLS_H_///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

// GameTools.cpp : Defines the exported functions for the DLL application.//#include "stdafx.h"//---------------------------------------------------------------------------------------------------------void WINAPI Game_RandomInit(UINT uSeed){::srand(uSeed);}INT WINAPI Game_RandomNumber(){return ::rand();}//---------------------------------------------------------------------------------------------------------


 

LIBRARY "GameTools"EXPORTS;RandomGame_RandomInit  @5Game_RandomNumber @6


 

 


动态连接库DLL的代码和数据,相同的部分可以在进程间共享。
DLL通过导出函数供其它装配件来使用。
VS中有wizzard可以生成DLL工程,它的输出目标是DLL文件(.dll后缀名),同时还生成导入库(.lib后缀的文件)。导入库包含该DLL的导出函数的列表,不含真实的代码。
 
exe文件记录它需要使用的DLL文件名及DLL中的函数名。此时exe文件在生成时需要和DLL配套的导入库链接(隐式链接)。
exe程序中也有可以由代码(API函数调用)动态加载DLL,并取得它导出的函数地址,再调用(显式链接)
一个DLL可以被多个exe使用,从而整体上节约了内存页的使用。
 
如果该DLL在其它进程中已经被加载,那么操作系统不会重复加载,直接把相同的代码和数据页面映射到本进程,只为不同的部分分配本进程使用的新的内存页面。动态加载DLL与此类似所以把可能被多个exe使用的公共函数放到DLL中能加快运行速度,节约内存的使用。
 
在进程装配时,如果该DLL装配件依赖其它DLL装配件,则操作系统会递归地依次装入它们。
 
一个进程由一个可执行装配件exe(含主入口程序)、一个或多个DLL装配件(某些exe装配件被动态装载时,算作动态装配件)、驱动程序装配件组成。
 
 

动态链接库是一种二进制级别的代码复用方法。

C++程序(类、函数等)则是源代码级别的代码复用方法。因为源代码若修改了整个软件都要重新编译。

编写大型工程/算法软件时一般都需要进行装配件模块的分划和设计。

 

 
 
DLL=.h+(.cpp+.def)
 
 
调用
#include "../GameTools/GameTools.h"
#pragma comment(lib, "../Debug/GameTools.lib")