首页 > 编程知识 正文

深入浅出MFC百度网盘,深入浅出MFC这本书的评价

时间:2023-05-06 11:45:13 阅读:206247 作者:4600

最近一两年都在搞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 程序的生死因果

就看到这里吧!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。