飛鴿傳書源碼分析-程序啟動過程
來源:程序員人生 發布時間:2014-10-02 08:00:01 閱讀次數:3226次
轉載請注明出處:http://blog.csdn.net/mxway/article/details/39581119
本文章是在飛鴿傳書的2.06源碼基礎上分析
飛鴿傳書源碼運行流程如下,本篇文章只說明了飛鴿傳書的啟動過程,對于飛鴿偉書的消息機制及菜單加載等功能都不在本篇文章范圍之內。

1. WinMain函數
int WINAPI WinMain(HINSTANCE hI, HINSTANCE, LPSTR cmdLine, int nCmdShow)
{
TMsgApp app(hI, cmdLine, nCmdShow);
return app.Run();
}
2.TApp類定義的部分源碼
class TApp{
protected:
<span style="white-space:pre"> </span>virtual BOOL InitApp(void);
<span style="white-space:pre"> </span>TWin *mainWnd;
public:
virtual void InitWindow() = 0;
virtual int Run();
};
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 void InitWindow(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 BOOL Create(LPCSTR className=NULL, LPCSTR title="", DWORD style=(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN), DWORD exStyle=0, HMENU hMenu=NULL);
virtual BOOL EvCreate(LPARAM lParam);
};
5.TMainWin類定義的部分源碼
class TMainWin : public TWin {
virtual BOOL EvCreate(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)
return TApp::DelWin(this), FALSE;
else
return TRUE;
}
該方法中調用了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
}
else
Show(SW_MINIMIZE);
}
此方法的功能是如果操作系統允許應用程序托盤到任務就以托盤方式運行,否則窗口就以就小化方式運行。至此,飛鴿傳書的主界面啟動完成。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈