飞鸽传书源码分析-程序启动过程
来源:互联网 发布:中国透析患者数据 编辑:程序博客网 时间:2024/05/22 04:55
转载请注明出处:http://blog.csdn.net/mxway/article/details/39581119
本文章是在飞鸽传书的2.06源码基础上分析
飞鸽传书源码运行流程如下,本篇文章只说明了飞鸽传书的启动过程,对于飞鸽伟书的消息机制及菜单加载等功能都不在本篇文章范围之内。
1. WinMain函数
int WINAPI WinMain(HINSTANCE hI, HINSTANCE, LPSTR cmdLine, int nCmdShow){TMsgAppapp(hI, cmdLine, nCmdShow);returnapp.Run();}
2.TApp类定义的部分源码
class TApp{protected:<span style="white-space:pre"></span>virtual BOOLInitApp(void);<span style="white-space:pre"></span>TWin*mainWnd;public:virtual voidInitWindow() = 0;virtual intRun();};
3. TMsgApp类的定义
class TMsgApp : public TApp {<span style="white-space:pre"></span>public:<span style="white-space:pre"></span>TMsgApp(HINSTANCE _hI, LPSTR _cmdLine, int _nCmdShow);virtual ~TMsgApp();virtual voidInitWindow(void);};
在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部分源码
void TMsgApp::InitWindow(void){<span style="white-space:pre"></span>mainWnd = new TMainWin(nicAddr, port_no);mainWnd->Create(class_name, IP_MSG, WS_OVERLAPPEDWINDOW | (IsNewShell() ? WS_MINIMIZE : 0));}
4.Twin类定义的部分源码
class TWin {public:virtual BOOLCreate(LPCSTR className=NULL, LPCSTR title="", DWORD style=(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN), DWORD exStyle=0, HMENU hMenu=NULL);virtual BOOLEvCreate(LPARAM lParam);};
5.TMainWin类定义的部分源码
class TMainWin : public TWin {virtual BOOLEvCreate(LPARAM lParam);};InitWindow中执行mainWnd->Create()方法,TMainWin继承Twin,由于TMainWin没有重写Create方法,所以此Create方法调用的是TWin中的Create,Twin::Create源码如下
BOOL TWin::Create(LPCSTR className, LPCSTR title, DWORD style, DWORD exStyle, HMENU hMenu){if (className == NULL)className = TApp::defaultClass;TApp::AddWin(this);if ((hWnd = ::CreateWindowEx(exStyle, className, title, style, rect.left, rect.top, rect.right, rect.bottom, parent ? parent->hWnd : NULL, hMenu, TApp::hI, NULL)) == NULL)returnTApp::DelWin(this), FALSE;elsereturnTRUE;}
该方法中调用了Windows API函数CreateWindowEx方法,调用该方法后将会触发一条WM_CREATE消息。该消息的处理函数是EvCreate(后面再详解飞鸽传书的消息机制)
在TMainWin中定义重写了父类Twin中的EvCreate方法,所以下面调用的是TMainWin中的EvCreate方法。EvCreate方法部分源码如下BOOL TMainWin::EvCreate(LPARAM lParam){if (IsNewShell()){Show(SW_HIDE);while (TaskBar(NIM_ADD, hMainIcon, IPMSG_MSGSTR) != TRUE)Sleep(1000);// for logon script}elseShow(SW_MINIMIZE);}
此方法的功能是如果操作系统允许应用程序托盘到任务就以托盘方式运行,否则窗口就以就小化方式运行。至此,飞鸽传书的主界面启动完成。
1 0
- 飞鸽传书源码分析-程序启动过程
- 飞鸽传书源码分析-程序启动过程
- 飞鸽传书源码分析-程序启动过程
- tomcat源码---启动过程分析
- Activity启动过程源码分析
- 源码分析Flume启动过程
- Tomcat源码分析--启动过程
- scrapy启动过程源码分析
- Activity启动过程源码分析
- Activity启动过程源码分析
- Activity启动过程源码分析
- peer启动过程源码分析
- macOS启动过程源码分析
- 源码分析Flume启动过程
- 飞鸽传书源码分析三-网络
- 飞鸽传书源码分析五-文件传输
- 飞鸽传书源码分析三-网络
- Openfire源码分析----程序启动
- cordova sqlite
- 地址的不同性与机器与程序的运行时间有关
- 在windows8中,不翻墙更新android sdk
- 基于NFS系统搭建discuz实现负载均衡
- JavaScript判断浏览器类型及版本
- 飞鸽传书源码分析-程序启动过程
- 工作要有“做好”的态度
- [leetcode]Single Number II 详解
- 如何实现在手指按下3秒后执行某个方法
- Java Jacob 写Word
- 图论算法——基于的java实现(dijkstra,bfs,dfs,floyd)
- 翻译后的Apache2配置文件——httpd.conf
- 用decorator来装饰动态的左侧菜单和内容部分
- Could not resolve SDK path for 'macosx10.8' 的解决