MFC的模块状态:从AfxGetApp()和AFX_MANAGE_STATE()看MFC的模块状态

AFX_MANAGE_STATE  MFC对于跨模块之间的调用破费心机,设计了一条STATE机制.而且设计的颇为麻烦.费了老鼻子劲终于探究了一二而已.转一篇分析的比较好的文章.http://hi.baidu.com/rootlife/blog/item/2f37e354ad8cdc5bd10906be.html这里补充几点:1._afxthreadstate 是全局的,至于每个线程中维护一个_afxthread 阅读详情

1.      Introduction

当我们在用MFC编程的时候,我们经常用到AfxGetApp()来获得当前的CWinAppInstance。看看MFC的源代码中AfxGetApp()的实现,你会发现AfxGetApp()的实现并不像一般情况下面那样直接:

_AFXWIN_INLINE CWinApp* AFXAPI AfxGetApp()

       { return afxCurrentWinApp; }

#define afxCurrentWinApp    AfxGetModuleState()->m_pCurrentWinApp

AfxGetApp()调用的是AfxGetModuleState(),该函数返回一个AFX_MODULE_STATE的指针,其中的一个成员保存着当前的CWinApp的指针。可AfxGetModuleState()的作用又是什么呢?

 

此外,当我们在开发MFC DLL程序的时候,我们会在每个输出的DLL函数前面加上一句AFX_MANAGE_STATE

void SomeMFCDllFunction()

{

AFX_MANAGE_STATE(AfxGetStaticModuleState())

 

AFX_MANAGE_STATE又是起什么作用呢?从字面上看来,它是Manage某种State,而AfxGetStaticModuleState又是获得State的,那么State究竟是什么呢?

MFC中,States用来保存某种相关的状态信息,分为下面几类:

1.     Process State,和某个单独的进程绑定起来

2.     Thread State,和某个单独的线程绑定

3.     Module State,和Module相关

前两种State和一般的全局变量十分类似,只是根据需求的不同被绑定于不同的进程/线程,如多线程支持等。而Module State本身比较特别,Module State根据情况的不同,可以是全局,线程,或者进程相关的State,并且可以根据要求快速切换。

2.      Process State

常见的Process State有:

1.     _AFX_WIN_STATE

2.     _AFX_DB_STATE

3.     _AFX_DEBUG_STATE

4.     _AFX_SOCK_STATE

5.     ……

从字面上面可以很容易猜出这些状态的用处。

MFC通过下面的宏来定义Process State:

#define PROCESS_LOCAL(class_name, ident_name) /

       AFX_COMDAT CProcessLocal<class_name> ident_name;

#define EXTERN_PROCESS_LOCAL(class_name, ident_name) /

       extern CProcessLocal<class_name> ident_name;

PROCESS_LOCALCProcessLocal模板类定义了一个CProcessLocal<class_name>的一个实例作为状态变量,而EXTERN_PROCESS_LOCAL则使在头文件中声明此状态变量。CProcessLocal的定义如下:

class AFX_NOVTABLE CProcessLocalObject

{

public:

// Attributes

       CNoTrackObject* GetData(CNoTrackObject* (AFXAPI* pfnCreateObject)());

 

// Implementation

       CNoTrackObject* volatile m_pObject;

       ~CProcessLocalObject();

};

 

template<class TYPE>

class CProcessLocal : public CProcessLocalObject

{

// Attributes

public:

       AFX_INLINE TYPE* GetData()

       {

              TYPE* pData = (TYPE*)CProcessLocalObject::GetData(&CreateObject);

              ENSURE(pData != NULL);

              return pData;

       }

       AFX_INLINE TYPE* GetDataNA()

              { return (TYPE*)m_pObject; }

       AFX_INLINE operator TYPE*()

              { return GetData(); }

       AFX_INLINE TYPE* operator->()

              { return GetData(); }

 

// Implementation

public:

       static CNoTrackObject* AFXAPI CreateObject()

              { return new TYPE; }

};

 

CProcessLocal的作用只是一个WrapperHold一个TYPE*的指针,一旦用户调用GetData来获得这个指针,GetData会首先判断该指针是否为空,如果为空,则创建一个新的实例保存起来,否则返回已有的指针。前提条件是,TYPE必须从CNoTrackObject继承。任何从CNoTrackObject继承的类都拥有自己的new/delete,这样此对象便不会被Debug的内存分配系统所跟踪而误判为Leak

AFX_MANAGE_STATE(AfxGetStaticModuleState()) 以前写MFCDLL的时候,总会在自动生成的代码框架里看到提示,需要在每一个输出的函数开始添加上AFX_MANAGE_STATE (AfxGetStaticModuleState())。一直不明白这样做的含义,也一直没有这样做,而且代码也工作得好好的,所以感觉这好像一句废话。 最近的项目中,需要在DLL里使用MFC生成界面,这才发现一旦资源放在不同的动态库里,而且还多线程搅在一起的时候,事情就... 阅读详情

相关推荐

正确使用AFX_MANAGE_STATE宏管理MFC模块状态AFX_MANAGE_STATE宏作用,真的很重要!!!

DLL 中使用 MFC 时,每个线程都需要正确的 MFC 模块状态,以确保使用 MFC 功能的正确性。在使用 MFC(Microsoft Foundation Classes)开发 DLL(动态链接库)时,正确管理 MFC 模块状态是确保功能正常运行的关键。在使用 MFC 开发 DLL 时,正确设置 MFC 模块状态是确保功能正常运行的基本步骤。宏是 MFC 提供的用于设置线程的 MFC 模块状态的工具。宏的重要性,以及在 DLL 中正确设置 MFC 模块状态的步骤。在 DLL 中的导出函数中,使用。

qq_44859843的博客 1542

C++实战之 windows MFC 工程应用开发与框架原理完全剖析

本课程是Windows程序设计系列课程三部曲之二:Windows MFC框架原理与工程应用开发。本课程重点讲解在windows平台开发使用MFC框架进行应用程序开发的核心手段.

MFC 模块切换 AFX_MANAGE_STATE(AfxGetStaticModuleState())

模块切换

weixin_45053845的博客 1015

转:MFC模块状态(AfxGetApp()AFX_MANAGE_STATE())

原文地址: http://hi.baidu.com/%CD%F8%C2%E7%C3%D4%CD%BE%C9%D9%C4%EA/blog/item/db8aa0c2bf5e0853b219a857.html1.      Introduction当我们在用MFC编程的时候,我们经常用到AfxGetApp()来获得当前的CWinApp的Instance。看看MFC的源代码中AfxGetApp()

czg1984的专栏 958

MFC模块状态AfxGetApp()AFX_MANAGE_STATE()

1. Introduction 当我们在用MFC编程的时候,我们经常用到AfxGetApp()来获得当前的CWinApp的Instance。看看MFC的源代码中AfxGetApp()的实现,你会发现AfxGetApp()的实现并不像一般情况下面那样直接: _AFXWIN_INLINE CWinApp* AFXAPI AfxGetApp()        { return af

chaozi2008的专栏 1025
上一篇: Mac OS X Programming读书笔记3 - 事件处理
下一篇: Mac OS X Programming读书笔记4 - Windows
ATField
博客等级 码龄25年 673粉丝 119原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值