深入浅出MFC
最近一兩年都在搞Java,C++逐漸生疏了。現在換工作又重新搞起了C++。其實學了多種語言后,就會發現語言真的沒那么重要。基礎的東西,如算法、數據結構、文件操作、進程、線程、同步機制,都是超出語言而存在的。即便具體到實現代碼,也是相差無幾。
最近憂心忡忡,工作多年,接觸太多技術,可都沒有深入和系統。一定要橫刀立馬,誓要作出成績。
MFC早已是棄子,但《深入淺出MFC》仍舊是如此經典,以至于超出MFC的范疇。當然,我會主要關注思想框架原理,而忽略MFC細節。C/C++的家族中,客戶端QT大行其道,中間件基本以跨平臺為主,且不會使用到MFC的API。至于服務端,則傾向于Linux。
文章目錄
- Win32 基本程序觀念
- windows SDK程序開發流程
- 消息循環(事件驅動)
- 進程與執行線程
- C++的重要性質
- MFC 六大關鍵技術之仿真
- MFC類別階層
- MFC 程序的初始化過程
- RTTI (執行時期型別辨識)
- Dynamic Creation (動態生成)
- Persistence(永續生存)機制
- Message Mapping(消息映射)
- Command Routing(命令繞行)
- MFC 程序的生死因果
Win32 基本程序觀念
windows SDK程序開發流程
消息循環(事件驅動)
以消息為基礎,以事件驅動之(message based, event driven)
上家公司做網絡SDK,底層實現是I/O多路復用,有大量的異步操作,如等待報警事件,所以對事件驅動的思想再熟悉不過了。從上圖可知,win32程序實現也是很簡單的,DispatchMessage 透過Windows USER 模塊的協助與監督,把消息分派至窗口函數。消息將在窗口函數中被判別并處理。
進程與執行線程
CreateProcess創建進程,CreateThread創建線程,線程還有另一個版本_beginthreadex(純C版本)。
我之前做的跨平臺SDK就是用的純C版,至于創建進程的我特地找了nginx的代碼(去掉異常邏輯):
CreateProcess(ctx->path, ctx->args,NULL, NULL, 0, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);ctx->child = pi.hProcess;CloseHandle(pi.hThread);return pi.dwProcessId;C++的重要性質
這一章的內容都比較淺,C++基本語法。我發現教材書上都很少會講到虛函數的實現原理,這里最起碼講到了。但模板講的太基礎了,在本章更像是重載多態的衍生品。
MFC 六大關鍵技術之仿真
MFC類別階層
MFC 程序的初始化過程
全局對象。
雖然以工作內容舉例不太合適,但的確也是用到了全局對象,只不過對應的類主要是用作資源管理。這個Effective C++有類似的例子。
RTTI (執行時期型別辨識)
通過宏定義,建立類與類之間的關聯。這個功能對于其他語言來講,早就在語言實現內了,我估計新的C++標準也已經實現了。
#define DECLARE_DYNAMIC(class_name) \ public: \ static CRuntimeClass class##class_name; \ virtual CRuntimeClass* GetRuntimeClass() const;Dynamic Creation (動態生成)
是RTTI的延續,RTTI建立關系,動態生成看重運行時創建對象,或者說給個對象名,就能創建對象。這點有些像java的反射機制。
#define DECLARE_DYNCREATE(class_name) \ DECLARE_DYNAMIC(class_name) \ static CObject* PASCAL CreateObject();Persistence(永續生存)機制
沒有看懂到底實現了個什么東西,或者說有什么用。序列化和反序列化?
#define DECLARE_SERIAL(class_name) \ DECLARE_DYNCREATE(class_name) \ friend CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb);Message Mapping(消息映射)
看到這里確實乏味了些,又是宏定義和宏實現,但這里仍舊沒給出貫通的細節。其實應該很簡單,建立消息和消息回調關系,收到消息找回調。
#define DECLARE_MESSAGE_MAP() \ static AFX_MSGMAP_ENTRY _messageEntries[]; \ static AFX_MSGMAP messageMap; \ virtual AFX_MSGMAP* GetMessageMap() const;Command Routing(命令繞行)
靠繼承和多態實現的,但個人感覺太亂,跳來跳去。
MFC 程序的生死因果
就看到這里吧!
總結
- 上一篇: 网络游戏简要策划案
- 下一篇: 最容易扩展的光立方程序设计