飛鴿傳書源碼分析-程式啟動過程,飛鴿傳書源碼
轉載請註明出處: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怎分析一個程式的原始碼
分析源碼的步驟是很隨意的
我覺得這個代碼寫不得不錯~公用檔案夾,放在工程的公用檔案夾就可以了
如果我的回答你沒有看懂的話,你可以先看看你的問題問清楚沒有?
一個軟體從原始碼到可執行程式,需要經曆幾個步驟的
一般經過編譯器編譯後就可以直接執行了。
編譯器一般有兩種執行方式:一種是邊解釋邊執行,一次將一條指令通過編譯器編譯成機器代碼後執行,然後再編譯下一條指令,此種方式必須通過編譯器來協助完成;另外一種是通過編譯器直接將程式原始碼直接編輯成可執行檔,可執行檔可獨立執行,用不著編譯器了。