飛鴿傳書源碼分析-程式啟動過程,飛鴿傳書源碼

來源:互聯網
上載者:User

飛鴿傳書源碼分析-程式啟動過程,飛鴿傳書源碼

轉載請註明出處: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);}

此方法的功能是如果作業系統允許應用程式托盤到任務就以托盤方式運行,否則視窗就以就小化方式運行。至此,飛鴿傳書的主介面啟動完成。


vc怎分析一個程式的原始碼

分析源碼的步驟是很隨意的
我覺得這個代碼寫不得不錯~公用檔案夾,放在工程的公用檔案夾就可以了

如果我的回答你沒有看懂的話,你可以先看看你的問題問清楚沒有?
 
一個軟體從原始碼到可執行程式,需要經曆幾個步驟的

一般經過編譯器編譯後就可以直接執行了。
編譯器一般有兩種執行方式:一種是邊解釋邊執行,一次將一條指令通過編譯器編譯成機器代碼後執行,然後再編譯下一條指令,此種方式必須通過編譯器來協助完成;另外一種是通過編譯器直接將程式原始碼直接編輯成可執行檔,可執行檔可獨立執行,用不著編譯器了。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.