///
#ifndef _GAME_TOOLS_H_
#define _GAME_TOOLS_H_
///
///
#ifdef _cplusplus
extern "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
;Random
Game_RandomInit @5
Game_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")