本文章是在飞鸽传书的2.06源码基础上分析

飞鸽传书源码运行流程如下,本篇文章只说明了飞鸽传书的启动过程,对于飞鸽伟书的消息机制及菜单加载等功能都不在本篇文章范围之内。

1. WinMain函数

[cpp] view plaincopy
  1. int WINAPI WinMain(HINSTANCE hI, HINSTANCE, LPSTR cmdLine, int nCmdShow)
  2. {
  3. TMsgApp app(hI, cmdLine, nCmdShow);
  4. return  app.Run();
  5. }

2.TApp类定义的部分源码

[cpp] view plaincopy
  1. class TApp{
  2. protected:
  3. <span style="white-space:pre">    </span>virtual BOOL       InitApp(void);
  4. <span style="white-space:pre">        </span>TWin       *mainWnd;
  5. public:
  6. virtual void        InitWindow() = 0;
  7. virtual int         Run();
  8. };

3. TMsgApp类的定义

[cpp] view plaincopy
  1. class TMsgApp : public TApp {
  2. <span style="white-space:pre">    </span>public:
  3. <span style="white-space:pre">        </span>TMsgApp(HINSTANCE _hI, LPSTR _cmdLine, int _nCmdShow);
  4. virtual ~TMsgApp();
  5. virtual void    InitWindow(void);
  6. };

在WinMain函数中定义了TMsgApp的对象app,app.Run由于TMsgApp继承TApp,而TMsgApp没有重写Run方法,所以此时调用父类TApp的Run方法,该方法中开头有如下两条语句

InitApp();

InitWindow();

这两条语句与下面的语句等价

this->InitApp();

this->InitWindow();

其意思就是调用TMsgApp的InitApp()和InitWindow()方法,由于TMsgApp没有重写InitApp()方法,所以调用的是父类的InitApp方法。TApp中定义的InitWindow是纯虚函数,所以this->InitWindow()调用的是TMsgApp中的InitWindow()方法。
InitWindow部分源码

[cpp] view plaincopy
  1. void TMsgApp::InitWindow(void)
  2. {
  3. <span style="white-space:pre">    </span>mainWnd = new TMainWin(nicAddr, port_no);
  4. mainWnd->Create(class_name, IP_MSG, WS_OVERLAPPEDWINDOW | (IsNewShell() ? WS_MINIMIZE : 0));
  5. }

4.Twin类定义的部分源码

[cpp] view plaincopy
  1. class TWin {
  2. public:
  3. virtual BOOL    Create(LPCSTR className=NULL, LPCSTR title="", DWORD style=(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN), DWORD exStyle=0, HMENU hMenu=NULL);
  4. virtual BOOL    EvCreate(LPARAM lParam);
  5. };

5.TMainWin类定义的部分源码

[cpp] view plaincopy
  1. class TMainWin : public TWin {
  2. virtual BOOL    EvCreate(LPARAM lParam);
  3. };

InitWindow中执行mainWnd->Create()方法,TMainWin继承Twin,由于TMainWin没有重写Create方法,所以此Create方法调用的是TWin中的Create,Twin::Create源码如下

[cpp] view plaincopy
  1. BOOL TWin::Create(LPCSTR className, LPCSTR title, DWORD style, DWORD exStyle, HMENU hMenu)
  2. {
  3. if (className == NULL)
  4. className = TApp::defaultClass;
  5. TApp::AddWin(this);
  6. if ((hWnd = ::CreateWindowEx(exStyle, className, title, style, rect.left, rect.top, rect.right, rect.bottom, parent ? parent->hWnd : NULL, hMenu, TApp::hI, NULL)) == NULL)
  7. return  TApp::DelWin(this), FALSE;
  8. else
  9. return  TRUE;
  10. }

该方法中调用了Windows API函数CreateWindowEx方法,调用该方法后将会触发一条WM_CREATE消息。该消息的处理函数是EvCreate(后面再详解飞鸽传书的消息机制)

在TMainWin中定义重写了父类Twin中的EvCreate方法,所以下面调用的是TMainWin中的EvCreate方法。EvCreate方法部分源码如下

[cpp] view plaincopy
  1. BOOL TMainWin::EvCreate(LPARAM lParam)
  2. {
  3. if (IsNewShell())
  4. {
  5. Show(SW_HIDE);
  6. while (TaskBar(NIM_ADD, hMainIcon, IPMSG_MSGSTR) != TRUE)
  7. Sleep(1000);    // for logon script
  8. }
  9. else
  10. Show(SW_MINIMIZE);
  11. }

此方法的功能是如果操作系统允许应用程序托盘到任务就以托盘方式运行,否则窗口就以就小化方式运行。至此,飞鸽传书的主界面启动完成。

本文出处:http://blog.csdn.net/mxway/article/details/39581119

飞鸽传书源码分析-程序启动过程相关推荐

  1. 飞鸽传书源码分析三-网络

    转载请注明出处:http://blog.csdn.net/mxway/article/details/44195099 本文是在飞鸽传书2.06源码基础之上进行分析的. 一.网络的初始化 飞鸽传书主窗 ...

  2. android版本飞鸽传书源码

    2019独角兽企业重金招聘Python工程师标准>>> 说明 第一次在eoe论坛发帖.去年11月份开始自学android开发, 长期混迹在eoe里潜水.今天来点贡献.贡献出我自己写的 ...

  3. 东风来了的飞鸽传书源码

    摘要:飞鸽传书源码 2012年07月13日浏览器支持IE,刁杨与小孽双双扮靓你的桌面,Mac等,由内地版瑶瑶刁杨,让她们与你日夜相伴,想要,对飞鸽传书2007访客而言,不能养宠物,最震撼的独家特权大礼 ...

  4. 表示深深的感谢飞鸽传书源码

    摘要:飞鸽传书源码 2012年07月13日最后找到旅馆订房资料,才紧急联络上当事人,就有机会获得抢鲜体验星辰变游戏的资格和游戏下次测试线上礼包等,如果一定要在公司上网,不止一次的表示希望游戏尽快推出, ...

  5. Linux飞鸽传书源码,Ubuntu 7.10下源码安装飞鸽传书IpMsg

    IPMsg 是一款局域网内即时通信软件, 基于 TCP/IP(UDP),可运行于多种操作平台(Win/Mac/UNIX/Java), 并实现跨平台信息交流. 不需要服务器支持,支持文件/文件夹的传送, ...

  6. Nimbus三Storm源码分析--Nimbus启动过程

    Nimbus server, 首先从启动命令开始, 同样是使用storm命令"storm nimbus"来启动 看下源码, 此处和上面client不同, jvmtype=" ...

  7. Linux飞鸽传书源码,图解Ubuntu下编译安装飞鸽传书IPMsg步骤

    因为IPMsg官方网站发布的Unix/Linux版本都是源代码包,需要在Ubuntu中编译,因此,需要在本机安装开发环境. 我下载的g2ipmsg-0.9.5.tar,下载地址见http://www. ...

  8. Linux飞鸽传书源码,Linux下的飞鸽传书

    202.106.74.* 于 2007-07-25 17:25:33发表: [root@DevHost g2ipmsg-0.8.6]# make make all-recursive make[1]: ...

  9. elasticSearch6源码分析(1)启动过程

    1.找到bin目录,下面有elasticSearch的sh文件,查看执行过程 exec \"$JAVA" \$ES_JAVA_OPTS \-Des.path.home=" ...

最新文章

  1. acme自动证书申请
  2. 分布式:阿里云HSF转dubbo+zookeeper
  3. 高精度加减法 1000阶乘求法
  4. [云炬创业基础笔记]第二章创业者测试7
  5. Lombok@Builder和@NoArgsConstructor冲突
  6. Linux命令之感叹号 !
  7. 谈谈我对正向代理和反向代理的理解
  8. access性别字段_12、ACCESS数据表的筛选(ACCESS图解操作系列)
  9. Android MVP开发模式及Retrofit + RxJava封装
  10. “盗版微信”通过反编译手段与正版互联互通,团伙被判刑
  11. 数学建模系列--模糊综合评价
  12. SmartSVN 11 破解 亲测可用 license
  13. 伪装苹果android id,小心了,别被伪造的 iOS 系统弹窗骗走 Apple ID
  14. 在 kali 中下载使用 Nessus
  15. App开发外包给专业软件开发公司,需要注意什么?
  16. python图片搜索_用Python构建图片处理搜索引擎
  17. SQL Server学习笔记6——LTRIM()函数(去掉空格)
  18. Like What Y ou Like: Knowledge Distill via Neuron Selectivity Transfer(2017)------论文阅读笔记
  19. 【Vissim】做一次完整的交通仿真——1.基本认识
  20. php+die(.)函数,die函数介绍与使用方法详解

热门文章

  1. 你用什么软件做笔记?
  2. docker启动容器之后马上又自动关闭
  3. JIRA6.3安装及alige插件破解
  4. 11GR2 中的常见 RMAN 问题
  5. 微服务(Microservice)那点事
  6. jd脚本 v4-bot 镜像部署和配置bot机器人
  7. 淘宝天猫商家运营,运营能力提升,淘宝竞争对手的分析,如何学习对手的优势运营方法
  8. c语言编程解三元一次方程组,三元一次方程组的解是 [] A.B.C.D
  9. 前端调用手机摄像头权限进行扫码解析
  10. 基于华为云原生数据湖MRS HetuEgine的数据虚拟化实践