`
yuanjinxiu
  • 浏览: 666002 次
文章分类
社区版块
存档分类
最新评论

第二人生的源码分析(3)程序入口点

 
阅读更多
所有Windows图形应用程序都是拥有相同的入口点函数WinMain,因此第二人生的程序也不例外。下面先来看看这个函数的代码,如下:
//蔡军生2007/12/28 QQ:9073204 深圳
#001int APIENTRY WinMain(HINSTANCE hInstance,
#002 HINSTANCE hPrevInstance,
#003 LPSTR lpCmdLine,
#004 int nCmdShow)
#005{
#006LLMemType mt1(LLMemType::MTYPE_STARTUP);
这行代码主要作用就是声明跟踪内存分配的类型。LLMemType类统计当前使用内存大小,并且可以输出内存的类型信息。
#007
#008// *FIX: global
#009gIconResource = MAKEINTRESOURCE(IDI_LL_ICON);
这行代码主要获取资源里的ICON图标句柄。
#010
#011// In Win32, we need to generate argc and argv ourselves...
#012// Note: GetCommandLine() returns apotentially return a LPTSTR
#013// which can resolve to a LPWSTR (unicode string).
#014// (That's why it's different from lpCmdLine which is a LPSTR.)
#015// We don't currently do unicode, so call the non-unicode version
#016// directly.
#017LPSTR cmd_line_including_exe_name = GetCommandLineA();
这里是获取命令行参数,在Windows API一日一练里已经介绍过,如果不懂可以参考它。
#018
#019const S32MAX_ARGS = 100;
#020int argc = 0;
#021char* argv[MAX_ARGS]; /* Flawfinder: ignore */
#022
#023fill_args(argc, argv, MAX_ARGS, cmd_line_including_exe_name);
上面这段代码是分析输入的命令行参数。
#024
#025LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32();
这行代码开始创建Windows窗口管理程序,也就是第二人生的管理类。
#026
#027// *FIX:Mani This method is poorly named, since the exception
#028// is now handled by LLApp.
#029bool ok = LLWinDebug::setupExceptionHandler();
这行代码实现了加载dbghelp.dll的功能,主要为了生成程序运行出错信息报表,可以精确地定位在那个模块里出错,并且把当时的环境参数全部生成报表,上传给第二人生开发厂家,以便改正这个出错的原因。
#030
#031// Actually here's the exception setup.
#032LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
#033prev_filter = SetUnhandledExceptionFilter(viewer_windows_exception_handler);
这里设置了系统异常出错处理函数,当应用程序产生非法出错时,就会调用这个函数来生成报表。
#034if (!prev_filter)
#035{
#036 llwarns << "Our exception handler (" << (void *)LLWinDebug::handleException << ") replaced with NULL!" << llendl;
#037 ok = FALSE;
#038}
#039if (prev_filter != LLWinDebug::handleException)
#040{
#041 llwarns << "Our exception handler (" << (void *)LLWinDebug::handleException << ") replaced with " << prev_filter << "!" << llendl;
#042 ok = FALSE;
#043 }
上面这段代码主要判断是否设置Windows异常处理成功。
#044
#045viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
这行代码保存异常处理函数。
#046
#047ok = viewer_app_ptr->tempStoreCommandOptions(argc, argv);
#048if(!ok)
#049{
#050 llwarns << "Unable to parse command line." << llendl;
#051 return -1;
#052}
#053
上面保存命令行参数。
#054ok = viewer_app_ptr->init();
#055if(!ok)
#056{
#057 llwarns << "Application init failed." << llendl;
#058 return -1;
#059}
#060
调用函数init来初始化整个应用程序,比如创建线程,初始化OpenGL等等,在这个函数里实现大部份功能的初始化。
#061 // Run the application main loop
#062if(!LLApp::isQuitting())
#063{
#064 viewer_app_ptr->mainLoop();
#065}
上面第62行检查否有退出应用程序的可能。
64行就进入了Windows应用程序的消息处理函数,在这个函数里实现主窗口的消息处理,还实现空闲处理,键盘输入处理,接收到网络命令,以及OpenGL渲染。
#066
#067if (!LLApp::isError())
#068{
#069 //
#070 // We don't want to do cleanup here if the error handler got called -
#071 // the assumption is that the error handler is responsible for doing
#072 // app cleanup if there was a problem.
#073 //
#074 viewer_app_ptr->cleanup();
#075}
#076delete viewer_app_ptr;
#077viewer_app_ptr = NULL;
#078return 0;
#079}
上面这段代码,检查是否出错退出,如果出错就清空所有分配的资源。最后删除应用程序管理类。
通过这个函数的学习,会发现第二人生的代码写得比较强悍的,不但出错的处理面面具到,还具备了运行时调试信息输出,强大的LOG系统功能。通过这个函数应学会怎么样添加处理系统异常出错的方法,调试发行版的程序方法,怎么生成具体的报表发送给软件开发厂商的实现。
总结一下,这里运行的流程:
1、 调用WIN API函数GetCommandLineA来获取命令行参数。
2、 调用fill_args函数分析命令行参数。
3、 调用函数LLWinDebug::setupExceptionHandler来加载调试库DebugHlp.dll
4、 调用函数SetUnhandledExceptionFilter来设置新异常处理。
5、 调函数viewer_app_ptr->init来实始化管理类所有初始化工作。
6、 调用函数viewer_app_ptr->mainLoop进入Windows的消息循环处理。
7、 删除所有分配的资源。
分享到:
评论

相关推荐

    第二人生游戏的源码分析集锦

    《第二人生游戏的源码分析集锦》是针对著名虚拟世界游戏“第二人生”进行深入技术探讨的资源集合。这份资料由CSDN社区的资深开发者贡献,旨在帮助游戏编程爱好者和专业人士理解游戏背后的复杂机制,提升自己的编程...

    quake3源码分析资料集锦

    CSDN上的分析文章,如"第二人生"和"传奇",可能进一步扩展了Quake3的源码应用,提供了实际项目中的经验分享和最佳实践。这些文章可能探讨了如何将Quake3的技术应用于其他游戏开发,或者介绍了在特定场景下优化源码的...

    Python3程序开发指南.第二版(带书签)+源码

    内容包括Python3程序开发指南.第二版(带书签),以及习题的源码。

    图解U-Boot:第二阶段源码分析

    图解U-Boot:第二阶段源码分析(清晰)

    DT仿dj169梦想人生舞曲网程序源码 v1.0.rar

    DT仿dj169梦想人生舞曲网程序源码介绍: 仿dj169梦想人生舞曲网程序利用强大的B2B门户信息系统 DT(destoon)下载模块改装而来, 2.0后续版本,修改 会员中心 后台界面。 增加栏目 DJ招聘 器材商城 夜场信息 娱乐资讯...

    人生重开模拟器微信小程序源码下载开启不一样的人生体验+网站版本源码双版本(已实测)

    这是一款人生重开模拟器微信小程序源码 让你的人生开启不一样的变化 不知道各位玩家有没有被最近超火的一款名为《人生重开模拟器》小游戏刷屏呢?想必不少玩家玩过了各种各样的模拟器,有的可以模拟医生,有的可以...

    java web开发实战1200例 第二卷 源码 (3/3)

    java web开发实战1200例 第二卷 源码 (3/3)

    1000个小CAD二次开发LISP程序源码

    同时,通过阅读和分析源码,可以学习到如何组织代码结构,如何处理错误,以及如何与AutoCAD的API交互等重要技能。 总的来说,"1000个小CAD二次开发LISP程序源码"是CAD开发者的宝贵资源库,它为初学者提供了丰富的...

    十二星座运势查询微信小程序源码支持多流量主提前查看(已实测)

    不错,这是一款星座查询小程序 该款小程序支持分男女查询 支持给综合运势,爱情运势,事业运势,财富运势等等打星 支持每种运势解说,支持查看特点等等功能 另外该款小程序还支持激励视频提前查看明日往后日子的运势 ...

    完整的进销存ERP管理系统源码+小程序

    一、源码介绍 所有行业的ERP系统/进销存/仓库系统,该系统为vs2012 .net+MsSQL版,目前标准版功能简单、明了、满足公司正常使用,已有多家企业正常使用,成熟稳定,有需要的可以下载看看。 二、主要功能 1、...

    PE文件分析程序源码

    **PE文件分析程序源码详解** PE(Portable Executable)文件是Windows操作系统中用于执行的二进制文件格式,它包含了程序的代码、数据、元数据等信息。本程序源码是一个简单的命令行工具,用于分析PE文件的结构,...

    JAVA版综合性实验学生成绩分析程序源码

    JAVA版综合性实验学生成绩分析程序源码 1.1 题目介绍 综合运用Java语言和面向对象技术开发一个小型软件系统:学生成绩分析程序,该程序支持 文本文件成绩单和对象文件成绩单,其中文本文件成绩单每行存储一个...

    120个小程序源码

    通过阅读和分析这些源码,开发者可以深入理解小程序的开发流程,学习到如何使用微信小程序开发工具、WXML(微信小程序的结构层语言)和WXSS(微信小程序的样式层语言),以及如何与微信小程序API进行交互。...

    小剧场短剧影视小程序源码 全开源 带支付等模式 付费短剧小程序源码.rar

    小剧场短剧影视小程序源码 全开源 带支付收益等模式 付费短剧小程序源码 多平台小程序支持 项目功能介绍 支持无限滑动 高性能滑动 预加载 视频预览 支持剧情介绍,集合壁纸另外仿抖音滑动效果 支持会员模式,支持...

    MFC Windows程序设计(第二版)(中文版)(含源码)

    MFC Windows程序设计(第二版)(中文版)(含源码) 很好的资源

    Linux常见驱动源码分析(kernel hacker修炼之道全集)--李万鹏

    Linux驱动修炼之道-触摸屏驱动之s3c2410_ts源码分析.pdf Linux驱动修炼之道-SPI驱动框架源码分析(中).pdf Linux驱动修炼之道-SPI驱动框架源码分析(下).pdf Linux驱动修炼之道-SPI驱动框架源码分析(上).pdf ...

    lighttpd源码分析

    《lighttpd源码分析》 lighttpd是一款轻量级的Web服务器,因其高效、安全和易配置的特性,在小型服务器和嵌入式设备上得到了广泛应用。源码分析是理解其工作原理的关键,这对于开发者来说是提升技能、优化性能的...

    Java Web程序设计任务教程源码(黑马程序员)

    8. **项目实战**:“黑马程序员”提供的源码是实战项目的实例,涵盖了上述所有技术点,读者可以跟随源码逐步理解并实现每个功能模块,从而提升实际开发能力。 总之,《Java Web程序设计任务教程》通过丰富的实例和...

    Linux的LCD驱动源码分析及移植.doc

    该驱动程序主要包括两个部分:第一部分是 LCD 控制器的寄存器设置,第二部分是 LCD 屏幕的刷新率设置。 LCD 控制器的寄存器设置主要包括以下几个方面: 1.寄存器地址:LCD 控制器的寄存器地址为 S3C24XX_PA_LCD,...

    微信商城小程序源码,永久免费全开源源码下载

    通过获取并分析源码,开发者可以学习到小程序的开发模式,了解其内部运行机制,实现个性化定制或二次开发。 “ThinkSNS社区源码”是一个知名的社交网络软件系统,提供了丰富的社区功能,如论坛、问答、博客等。将...

Global site tag (gtag.js) - Google Analytics