《仿真机器人足球》由会员分享,可在线阅读,更多相关《仿真机器人足球(71页珍藏版)》请在金锄头文库上搜索。
1、主要内容v基本赛事简介v仿真开发基础 掌握仿真平台接口; 熟悉比赛规则; C语言及其开发环境、DLL编程; 比赛策略、动作函数;v资料下载 e-mail: password:1231机器人足球两大赛事11 VS 11仿真组比赛5 VS 5 小型机器人组比赛小型机器人组标准比赛(每队11人)中型机器人组比赛Sony四腿机器人比赛2仿真机器人足球比赛02023仿真比赛的特点v仿真实物半自主机器人足球比赛;仿真实物半自主机器人足球比赛;v所有的硬件设备均由计算机模拟实现;所有的硬件设备均由计算机模拟实现;v简化比赛系统复杂度,减少硬件需求简化比赛系统复杂度,减少硬件需求 ;v可控性好、无破坏性、可重
2、复使用,不受硬件条件可控性好、无破坏性、可重复使用,不受硬件条件和场地环境的限制;和场地环境的限制;v研究人工智能的绝佳平台研究人工智能的绝佳平台;03034SimroSot 5vs.5仿真平台v仿真平台安装v仿真平台接口 策略菜单 时间/记分菜单 重放v仿真比赛规则场地、球、车比赛时间、进球、判罚、记分5SimuroSot5vs5平台安装v平台提供了基本的策略开发框架平台提供了基本的策略开发框架, ,见安装目录下的见安装目录下的Strategy SourceStrategy Source目录目录 如如:C:Program FilesRobot :C:Program FilesRobot So
3、ccer v1.5aStrategy Source)Soccer v1.5aStrategy Source)v模板程序为模板程序为DLLDLL动态链接库。动态链接库。v动态链接库文件存放路径动态链接库文件存放路径 C:strategyyellow; C:strategyblue; C:strategyyellow; C:strategyblue;07076SimuroSot5vs5用户接口7 SimuroSot5vs5平台菜单 vA.策略载入vB.犯规/控球 裁判使用,哪方犯规,由谁控球 相应修改Gamestate、whosball的值vC. 开始比赛vD. 当前时间/比分vE. 修改时间和比
4、分vG. 开始一场新的比赛vH. 帮助及规则8比赛规则:场地和球goal line( 门线):球门前长40cm的线penalty area(禁区、罚球区): A+B+圆弧区 ball:直径42.7mm, 重46ggoal areagoal area( 小禁区、球门区):A9比赛规则:车0101VSVS黄队黄队蓝队蓝队西北工业大学代表队西北工业大学代表队石油大学代表队石油大学代表队队标:3.5cm*3.5cm机器人:7.5cm*7.5cm*7,5cm10机器人的编号vHomeHome代表己方代表己方机器人机器人vOpp Opp 代表对方代表对方机器人机器人v箭头所指的方箭头所指的方向为机器人当向
5、为机器人当前的正方向前的正方向0202home1home1home2home2home3home3home4home4opp1opp1opp2opp2opp3opp3opp4opp4opp0opp0home0home011机器人的辨认v每方队员有五名,分别用不同的颜色每方队员有五名,分别用不同的颜色来标示,中间色块代表队伍的颜色,来标示,中间色块代表队伍的颜色,左下角色块是区分不同队员的标识:左下角色块是区分不同队员的标识:0号一般是号一般是守门员守门员,用大红色表示;,用大红色表示;1号用紫色表示,号用紫色表示,2号用紫红色表示;号用紫红色表示;3号用绿色表示,号用绿色表示,4号用蓝绿色表示
6、;号用蓝绿色表示;030312比赛规则:开球(place kick)v投硬币,胜者选择队标;v加载策略;v裁判选定控球方;v双发按照定位球规则摆队形(place kick) ;进攻方首先在自己球场和中圈内自由布置队员;防守方只能在自己球场内(不包括中圈)布置队员。v下半场开始交换场地 进球后,上、下半场开始后,都将球放 在场地中央,球首先要踢回进攻方半 场; 若在5秒钟之内,没有踢回自己半场, 重新开定位球; 若这种情况出现两次,则由对方开定位 球。13比赛规则:比赛中断重新摆球v进球得分(scored)或犯规(foul)v裁判员判罚点球(penalty kick)、任意球(free-kick
7、)、门球(goal kick)、争球(free-ball)v仿真软件出错v突发事件14比赛规则:记分方法v球全部通过门线,计一分;分高的一方胜出;v加时赛(tiebreaker 平分决赛): 下半场结束时若不分胜负,则休息5分钟后,最多加时3分钟,采用突然死亡办法产生胜出方。 若3分钟后仍然平局,则由点球决定胜负。v 球场上只能有一个进攻队员和一个守门员;v 双方各踢三个点球,所有点球必须由一个队员完成;v 裁判吹哨30秒后或球出门区,点球结束; 若三次点球后仍然平局,双发互踢点球,直到有一方得分;15比赛规则:点球(Penalty-Kick)点球摆位除守门员和罚球队员,其余队员在球场另一侧任
8、意摆位;罚球队员位于球后,可以踢球、可以带球;守门员必须接触门线;防守方先摆球;点球判罚 门区内多于一个防守队员; 守门员10秒内没有将球踢出门 区; 比赛进行中不经裁判同意,操 作机器人; 大禁区内超过3个防守队员;16比赛规则:任意球(Free-Kick)任意球摆位v球摆放在任意球罚球点,罚球队员位于球后;v进攻方在己方半区任意摆位;v防守方两个队员压前方门线的左右两端,另外两个压禁区边线;v防守方先摆队形。任意球判罚v 冲撞对方球员,直接影响比赛;v 允许推球和对方球员,推动方一直与球保持 接触;17比赛规则:争球(Free-Ball)争球判罚v门区外僵局10秒钟,僵局即球以极低的速度移
9、动,由裁判判断。争球摆位v球摆到犯规发生区域内的争球点上;v双方各一个队员放在距球水平25cm外的位置处;近球门的队员要接触T垂直线,队员可以带稍微角度(5度)v其它队员任意摆在1/4争球区域外;v防守方先摆位;18比赛规则:门球(Goal-Ball)门球判罚v进攻方多于一个队员进入对方门区;v进攻方机器人推或阻碍对方守门员;v进攻方队员推对方守门员(球位于中间)进球;v进攻方队员推对方守门员(球位于中间),影响守门员运动;v门区内僵局10秒;v如果进攻队员碰巧撞到守门员,但没有影响守门员防守的能力,不判门球;v若球位于守门员和进攻队员之间,允许在门区内推守门员,但不允许将守门员推入门。门球摆
10、位v进守门员在门区内,球位于门区内的任意位置;v进攻方队员摆放在门区外任意位置;v防守方先将队员在己方半场;191.仿真平台使用介绍20MLS平台系统特点v机器人模型:机器人模型: Yujin Yujin机器人的物理模型。机器人的物理模型。v模拟精确:模拟精确: 碰撞检测完全,碰撞处理准确仿真极为真实碰撞检测完全,碰撞处理准确仿真极为真实 (采用商业游戏引擎公司(采用商业游戏引擎公司HavokHavok的碰撞处理引擎的碰撞处理引擎 作品作品 帝国时代、帝国时代、CSCS等)。等)。v系统界面:系统界面: 3 3维(采用维(采用DirectorDirector设计界面,设计界面,3D Max3D
11、 Max建模)建模)。040421MLS平台系统需求v硬件需求:硬件需求:Pentium III 600 MHzPentium III 600 MHz或与其性能相当的或与其性能相当的CPUCPU;256M256M系统内存;系统内存;具有具有32M32M显存的显存的TNT2TNT2或其以上级别的显示卡;或其以上级别的显示卡;至少可以实现至少可以实现800600800600分辨率的显示器;分辨率的显示器;v软件需求:软件需求:Windows98Windows98或以上版本的操作系统;或以上版本的操作系统;DirectX 8.0DirectX 8.0或以上版本;或以上版本;050522软件开发环境v
12、LingoLingovMicrosoft Visual CMicrosoft Visual C6.06.0vMicrosoft Visual CMicrosoft Visual C.NET 2003.NET 2003vMicrosoft Visual CMicrosoft Visual C.NET 2005.NET 20050606 232.仿真平台与策略程序的关系242.1 什么是策略程序?v定义:定义: 策略程序就是自己编写的能够使仿真平台中机器人按照预策略程序就是自己编写的能够使仿真平台中机器人按照预定方式运动的程序。定方式运动的程序。v通俗的来说,就是能够打比赛的程序通俗的来说,就是能
13、够打比赛的程序。0101252.2 仿真平台与程序的通讯方式0202策略程序接受数据策略程序接受数据策略程序发送数据策略程序发送数据MLSMLS平台平台MLSMLS策略程序策略程序策略程序将接受的策略程序将接受的数据进行处理数据进行处理262.3 2.3 场地信息介绍场地信息介绍03030303( (6.8118, 6.37306.8118, 6.3730) )( (6.8118, 77.23926.8118, 77.2392) )( (93.4259, 77.239293.4259, 77.2392) )( (93.4259, 6.373093.4259, 6.3730) )( (0,00,
14、0) )( (单单位位: :英英寸寸) )说明:说明:说明:说明:1 1 1 1英寸英寸英寸英寸= 2.54= 2.54= 2.54= 2.54厘米厘米厘米厘米272.4 场地的各种标志及尺寸04040404( (单单位位: :厘厘米米) )282.5 2.5 球与车的长度尺寸球与车的长度尺寸05050505前前约约4.3184.318球球机器人机器人约约7.97567.9756(0.0 ,0.0)(0.0 ,0.0)X XY Y转角方向转角方向 0 0( (单单位位: :厘厘米米) )转角方向转角方向 -179 -179292.6 程序每周期接受的数据仿真平台传递给策略程序的数据仿真平台传递
15、给策略程序的数据: :v 己方、对方机器人坐标、角度(当前己方、对方机器人坐标、角度(当前 周期,上一周期)。周期,上一周期)。v 球的坐标(当前周期,上一周期)。球的坐标(当前周期,上一周期)。v 场地数据。场地数据。v 控球方。控球方。06060606302.7 程序每周期发送的数据策略程序发送给仿真平台的数据策略程序发送给仿真平台的数据: :v己方己方( homei )( homei )每个机器人的左轮速度(每个机器人的左轮速度(vlvl)和右)和右轮速度(轮速度(vrvr)v注:注:当前发送的数据要到下一周期才能执行。当前发送的数据要到下一周期才能执行。07070707313.策略程序
16、323.1 3.1 策略类视图策略类视图02020202333.2 3.2 环境接口文件环境接口文件InterFace.hInterFace.h030303031.环境信息环境信息/主要的定义主要的定义,包含所有运行时的的信息包含所有运行时的的信息,由系统刷新由系统刷新typedef structRobot homePLAYERS_PER_SIDE; /我方机器人数组我方机器人数组OpponentRobot opp PLAYERS_PER_SIDE;/敌方机器人数组敌方机器人数组Ball currentBall,/当前小球的位置当前小球的位置 lastBall,/上一次小球的位置上一次小球的位
17、置 predictedBall;/预计的小球的位置预计的小球的位置Bounds fieldBounds,/场地范围场地范围 goalBounds;/球门的位置与范围球门的位置与范围long gameState;/当前游戏的状态当前游戏的状态long whosBall;/由谁控制球由谁控制球void *userData;/用户自定义信息用户自定义信息 Environment;342. 比赛状态vconst long FREE_BALL = 1; / 争球vconst long PLACE_KICK = 2; / 定位球vconst long PENALTY_KICK = 3; / 点球vcons
18、t long FREE_KICK = 4; / 任意球vconst long GOAL_KICK = 5; / 门球353. 场地信息 vconst double FTOP = 77.2392; / 场地上边界vconst double FBOT = 6.3730; / 场地下边界vconst double FRIGHTX = 93.4259; / 场地右边界vconst double FLEFTX = 6.8118; / 场地左边界vconst double GTOPY = 49.6801; / 球门上边界vconst double GBOTY = 33.9320; / 球门下边界vcons
19、t double GRIGHT = 97.3632; / 球门右边界vconst double GLEFT = 2.8748; / 球门左边界36374. 控球方vconst long ANYONES_BALL = 0; / 没有控球vconst long BLUE_BALL = 1; / 蓝队控球vconst long YELLOW_BALL = 2; / 黄队控球38/位置向量定义位置向量定义typedef structtypedef struct double x, y, z; double x, y, z; / x / x 和和 y y 为坐标值为坐标值 Vector3D; Vecto
20、r3D;typedef structVector3D pos;/ / 机器人坐标机器人坐标double rotation;/ / 机器人方向角机器人方向角double velocityLeft, velocityRight; / / 机器人左右轮速度机器人左右轮速度 Robot060606065.5.己方机器人的信息定义己方机器人的信息定义39typedef struct Vector3D pos; / / / 机器人的坐标位置机器人的坐标位置 double rotation; / / 机器人当前的转角机器人当前的转角 OpponentRobot;080808086.6.对对方机器人的信息的定
21、义方机器人的信息的定义typedef structVector3D pos; / / 小球的坐标位置小球的坐标位置 Ball;7.7.小球的位置定义小球的位置定义40101010108.场地区域范围场地区域范围typedef structtypedef struct long left, long left, /场地左边界场地左边界 right,right,/场地右边界场地右边界top,top, /场地上边界场地上边界bottom; bottom; /场地下边界场地下边界 Bounds; Bounds;413.3 基本动作函数Action.hAction.h/设置小车轮子速度设置小车轮子速度v
22、oid Velocity ( Robot *robot, int vl, int vr );/ 小车转角控制小车转角控制void Angle ( Robot *robot, int desired_angle);/移动小车到指定位置移动小车到指定位置void Position( Robot *robot, double x, double y );421. Velocity 动作函数v该动作可以给机器人自由的发轮速(在该程序中可以简单的该动作可以给机器人自由的发轮速(在该程序中可以简单的认为轮速就是机器人的推进力)。认为轮速就是机器人的推进力)。v小车速度被限制为小车速度被限制为 125 12
23、5 125125 之间。之间。/形参形参robot robot 指定小车号指定小车号, ,形参形参vl vl 左轮速左轮速, vr , vr 右轮速右轮速void Velocity( Robot *robot, int vl, int vr )void Velocity( Robot *robot, int vl, int vr ) robot-velocityLeft = vl; robot-velocityRight = vr;43 机器人的运动控制机器人的运动控制02020202左轮速左轮速vlvl右轮速右轮速vrvr注注: vl vr vl vr 机器人顺时针旋转机器人顺时针旋转 vl
24、 vr vl home2, 20, 20); Velocity(&env-home2, 20, 20); / /让让1 1号机器人左轮子都以号机器人左轮子都以-20-20的轮速后退的轮速后退 Velocity(&env- home1, -20, -20); Velocity(&env- home1, -20, -20); / /给给3 3号机器人左轮发号机器人左轮发100, 100, 右轮发右轮发2020 Velocity(&env- home3, 100, 20); Velocity(&env- home3, 100, 20); 03030303452. Angle 动作函数 v该动作可以让
25、机器人转到指定的任意角度。并做直线运动。该动作可以让机器人转到指定的任意角度。并做直线运动。v/形参形参robot robot 指定小车号指定小车号, ,形参形参desired_angledesired_angle为目标角度为目标角度vvoid Angle(Robot *robot,int desired_angle)void Angle(Robot *robot,int desired_angle)04040404void Angle(Robot *robot,int desired_angle) int theta_e, vl, vr; theta_e = desired_angle -
26、(int)robot-rotation; /目标角度与当前角度差目标角度与当前角度差 while (theta_e 180) theta_e -= 360; /正方向旋转调整到正方向旋转调整到-180180 while (theta_e -180) theta_e += 360; if (theta_e 90) theta_e -= 180; if (abs(theta_e) 50) vl = (int)(-9./90.0 * (double)theta_e);vr = (int)(9./90.0 * (double)theta_e); else if (abs(theta_e) 20) vl
27、 = (int)(-11.0/90.0 * (double)theta_e);vr = (int)(11.0/90.0 * (double)theta_e); Velocity (robot, vl, vr);46Angle函数举例void NormalAngle( Environment* env)void NormalAngle( Environment* env) / /让让1 1号机器人转到号机器人转到3030度角度角 Angle(&env-home1, 30); Angle(&env-home1, 30); / /让让3 3号机器人转到号机器人转到-60-60度角度角 Angle(&
28、env-home3, -60); Angle(&env-home3, -60); 06060606483. Position 动作函数v该动作可以让机器人跑到场地上指定的任何地点。该动作可以让机器人跑到场地上指定的任何地点。/形参形参robot robot 指定小车号指定小车号 / /形参形参 x x 目标位置目标位置X X坐标坐标 y y 目标位置目标位置Y Y坐标坐标void Position( Robot *robot, double x,void Position( Robot *robot, double x, double y );double y );0707070749 机器人
29、的指定点运动图示08080808?度度左轮速左轮速vlvl右轮速右轮速vrvr球位置球位置2 2球位置球位置1 1Position Position Position Position 函数函数函数函数 根据目标位置可进行转角的控制。根据目标位置可进行转角的控制。50 机器人的指定点运动机器人坐标(x0,y0),目标点坐标为(xa ,ya),机器人球员坐标和目标坐标连线与水平线x轴的夹角angle (home2, env-lastBall.pos.x, Position( &env-home2, env-lastBall.pos.x, env-lastBall.pos.y);env-lastB
30、all.pos.y);/让让2 2号机器人跑到场地中心号机器人跑到场地中心double x = ( env-fieldBounds.left + env- fieldBounds.right ) double x = ( env-fieldBounds.left + env- fieldBounds.right ) / 2; / 2;double y = ( env-fieldBounds.bottom + env- fieldBounds.top ) double y = ( env-fieldBounds.bottom + env- fieldBounds.top ) / 2; / 2;P
31、osition(&env-home2, x, y);Position(&env-home2, x, y); 09090909534 三个动作函数组合使用void Normal( Environment* env )void Normal( Environment* env ) Position(&env-home0, env-goalBounds.left + 10, Position(&env-home0, env-goalBounds.left + 10, env-currentBall.pos.y) env-currentBall.pos.y); /让让0 0号机器人在球门附近跟着球的号
32、机器人在球门附近跟着球的y y坐标跑坐标跑Velocity(&env-home1, 10 , 70 ); Velocity(&env-home1, 10 , 70 ); /让让1 1号机器人逆时针转圈号机器人逆时针转圈Position(&env-home2, env-currentBall.pos.x,Position(&env-home2, env-currentBall.pos.x, env-currentBall.pos.y ); env-currentBall.pos.y ); /让让2 2号机器人追着球跑号机器人追着球跑Angle(&env-home3, -60); Angle(&e
33、nv-home3, -60); /让让3 3号机器人追着球跑号机器人追着球跑Velocity(&env-home4, 5 , 5 ); Velocity(&env-home4, 5 , 5 ); /让让1 1号机器人逆时针转圈号机器人逆时针转圈 10101010545 注意事项l轮数速度限制为轮数速度限制为 -125-125 125125l平台原始接口中提供了比赛状态平台原始接口中提供了比赛状态( (GameStateGameState) )以及控球方以及控球方( (WhosBallWhosBall) )两个参数,但经过实际开发时发两个参数,但经过实际开发时发现现他们毫无任何他们毫无任何用处,
34、故需要自己判断。用处,故需要自己判断。l场地度量单位为英寸,场地度量单位为英寸,1 1英寸英寸 = 2.54= 2.54厘米厘米l机器人角度的单位为角度(机器人角度的单位为角度(不是弧度不是弧度)l如果场地不同,队伍需要转换左右半场坐标如果场地不同,队伍需要转换左右半场坐标11111111553.4 策略程序Strategy.cpp与仿真平台通讯的一个结构与仿真平台通讯的一个结构EnvironmentEnvironment和三个函数的声明和三个函数的声明/比赛开始时系统调用一次比赛开始时系统调用一次extern C STRATEGY_API void Create ( Environment
35、*env ); /比赛过程中由系统循环调用(比赛过程中由系统循环调用(策略都放在里面策略都放在里面)。)。extern C STRATEGY_API void Strategy ( Environment *env );/比赛结束时系统调用一次比赛结束时系统调用一次extern C STRATEGY_API void Destroy ( Environment *env );561.Strategy1.Strategy 接口函数解析接口函数解析接口函数解析接口函数解析04040404 函数接口函数接口 Strategy是程序的主要执行逻辑,由系统反复调用,每次是程序的主要执行逻辑,由系统反复调
36、用,每次调用时系统通过调用时系统通过Environment* env这个指针向我们传递当前周期系统这个指针向我们传递当前周期系统提供信息,在这里,我们必须处理针对赛场上每一时刻的对策,通过策提供信息,在这里,我们必须处理针对赛场上每一时刻的对策,通过策略运算设置己方小车的左右轮转速,来控制机器人进行足球比赛。略运算设置己方小车的左右轮转速,来控制机器人进行足球比赛。 每秒调用次数依靠机器能力来定,默认为每秒调用次数依靠机器能力来定,默认为60次,即仿真的一个周期次,即仿真的一个周期为为1/60秒。秒。 extern C STRATEGY_API void Strategy ( Environm
37、ent *env );572. strategy策略函数基本结构1) 根据不同比赛状态采用不同的策略switch(env-gameState) case 0 : strategyForD(env);break; /默认 case FREE_BALL : strategyForD(env); break; /争球 case PLACE_KICK : /定位球 MoonAttack ( &env-home 3,3, env ); strategyForD(env); break; case PENALTY_KICK : strategyForPeK(env); break; /点球 case FR
38、EE_KICK : strategyForD(env); break; /任意球 case GOAL_KICK : / 门球 MoonAttack ( &env-home 3,3, env ); strategyForD(env); break; 582. strategy策略函数基本结构 2)根据球所在区域,采用不同队形,attack()定义四种进攻队形,defend() 定义四种防守队形 void strategyForD(Environment *env) whereIsBall(); /判断球所在区域WIB switch(WIB) case 1 : attack(4,env); bre
39、ak; /球在一号区,采用进攻队形4 case 2 : attack(5,env); break; /球在二号区,采用进攻队形5 case 3 : attack(6,env); break; /球在三号区,采用进攻队形6 case 4 : attack(7,env); break; /球在四号区,采用进攻队形7 case 5 : attack(8,env); break; /球在五号区,采用进攻队形8 case 6 : attack(9,env); break; /球在六号区,采用进攻队形9 case 7 : defend1(1,env); break; /球在七号区,采用防守队形1 case
40、 8 : defend1(2,env); break; /球在八号区,采用防守队形2 case 9 : defend1(3,env); break; /球在九号区,采用防守队形3 592. strategy策略函数基本结构 3)根据不同队形,给四个机器人分配不同角色waiter(), attacker().void attack(int wib,Environment *env) if(wib = 4) / 四号进攻队形 waiter(&env-home1, 1, 85, 21); /一号在球场右下方待命,球靠近则踢球 waiter(&env-home2, 2, 80, 64); /二号在球场
41、右上方待命,球靠近则踢球 attacker(&env-home4,4); /四号队员角色为进攻 negativeDefender(&env-home3, 3, 0, 43); /三号协防 else if(wib = 5) /五号进攻队形 else if(wib = 6) /五号进攻队形 602. strategy策略函数基本结构 4) 角色函数调用动作函数完成任务 waiter()- go() - rotateto() - run(); attacker()-go()-rotateto()-run(); negativedefender()-go()-rotateto() activedefe
42、nder()-go()-rotateto() 6162DLL概述 vDLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。v“无库静态链接库动态链接库”v静态链接库与动态链接库都是共享代码的方式;v静态链接库,lib中的指令都被直接包含在最终生成的 EXE文件中了静态链接库中不能再包含其他的动态链接库或者静态库。v但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。动态链接库中还可以再包含其他的动态或静态链接库。63DLLvDLL 的编制与具体的编程语言及编译器无关v动态链接库随处可见 Windowssyst
43、em32目录下 kernel32.dll函数主要处理内存管理和进程调度 user32.dll函数主要控制用户界面。(MessageBox函数) gdi32.dll函数则负责图形方面的操作。 vwindows的大多数API都包含在这些DLL中64VC动态链接库的分类vVisual C+支持三种DLL,Non-MFC DLL(非MFC动态库): 不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC Regular DLL(MFC规则DLL)包含一个继承自CWinApp的类,但其无消息循环MFC Extension DLL(MFC扩展DLL)采用MFC的动
44、态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。65静态链接举例v库不是个怪物,编写库的程序和编写一般的程序区别不大,只是库不能单独执行;v库提供一些可以给别的程序调用的东西,别的程序要调用它必须以某种方式指明它要调用之。vDLL内的函数分为两种:v(1)DLL导出函数,可供应用程序调用;v(2) DLL内部函数,只能在DLL程序使用,应用程序无法调用它们66静态链接举例/文件:lib.h #ifndef LIB_H #define LIB_Hint add(int x,int y) extern C int add(int x,int y);/声明为C编译、连接方式的外部函数 #
45、endif/文件:lib.cpp #include lib.h int add(int x,int y) return x + y; 67静态链接举例#include #include .lib.h#pragma comment( lib, .debuglibTest.lib ) /指定与静态库一起连接int main(int argc, char* argv)printf( 2 + 3 = %d, add( 2, 3 ) );68非MFC DLLvVC+中new一个Win32 Dynamic-Link Library工程dllTest/* 文件名:lib.h*/#ifndef LIB_H#d
46、efine LIB_Hextern C int _declspec(dllexport)add(int x, int y);#endif/* 文件名:lib.cpp*/#include lib.hint add(int x, int y)return x + y;/* _declspec(dllexport) 声明函数add为DLL的导出函数69非MFC DLL#include #include typedef int(*lpAddFun)(int, int); /宏定义函数指针类型int main(int argc, char *argv)HINSTANCE hDll; /DLL句柄lpAd
47、dFun addFun; /函数指针hDll = LoadLibrary(.DebugdllTest.dll);if (hDll != NULL)addFun = (lpAddFun)GetProcAddress(hDll, add);if (addFun != NULL)int result = addFun(2, 3);printf(%d, result);FreeLibrary(hDll);return 0;70非MFC DLLvDllMain 函数在DLL被加载和卸载时被调用,在单个线程启动和终止时,DLLMain函数也被调用。vul_reason_for_call指明了被调用的原因。原因共有4种:PROCESS_ATTACHPROCESS_DETACHTHREAD_ATTACHTHREAD_DETACH71