请教:AfxGetApp如何取得全局对象的指针?

嗷嗷叫的老马 2010-01-05 07:17:57
问大家个问题,AfxGetApp如何取得全局对象的指针?全局对象的名字不一定是theApp,它是怎么自动被全局函数得到的呢?

//

PS:

帮朋友问的,他现在不方便上网...........
...全文
443 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
huacam 2010-07-20
  • 打赏
  • 举报
回复
学习了
嗷嗷叫的老马 2010-01-24
  • 打赏
  • 举报
回复
了解
myliupp 2010-01-21
  • 打赏
  • 举报
回复
  谢谢老马和各位网友的答复,本人上月因痔疮手术住院才出来,在这里也向程序员网友建议:注意不要久坐,喝酒吃辣椒等,以防像我这样挨一刀。
  6楼给出了方向,15楼给出了思路,16楼给出了答案,因此我想老马,你分别给10分,5分,25分比较好。分数不多不过希望这个问题对大家有帮助。
  答案解释了《深入浅出MFC》中程序可以通过编译链接但却出现运行时错误的原因,因为指针没有被初始化,所以会导致访问出错。另外,书中JJHou的例子并没有把这个细节给表现出来,而是直接假定theApp永远就叫theApp。如果看过《MFC Windows程序设计》的话,那里面的例子程序实例名就不是theApp,且程序是手工写的,没有用向导。
SolidRabbit 2010-01-06
  • 打赏
  • 举报
回复
我想应该是这样的:
有一个不受开发者影响的全局对象g_obj,在你的CWinApp类的构造函数里有类似这样的语句
g_obj.m_pApp = this;
这样不论你怎么搞,全局对象的指针都会到一个地方去,AfxGetApp()的实现也就只是从一个固定的全局对象里取数据了。
red-fly 2010-01-06
  • 打赏
  • 举报
回复
AfxGetApp()返回一个CWinApp指针,实际上,它是指向你自己的CxxApp的一个指针,而CxxApp是从CWinApp派生出来。这其中用到的就是C++“虚”的特性
在CxxApp的文件中,一般都会声明一个theApp,而它是一个全局变量,它会产生CxxApp的实例,我认为,AfxGetApp()正是返回的这个变量
更详细情况,就需要跟踪程序来看一看了。这个问题倒是从来没有追究过
peimoxu 2010-01-06
  • 打赏
  • 举报
回复
一看就是没有MFC基础,和APP的对象名字没有关系
嗷嗷叫的老马 2010-01-06
  • 打赏
  • 举报
回复
先谢谢大家了,嘿嘿...
嗷嗷叫的老马 2010-01-06
  • 打赏
  • 举报
回复
......你的眼里就只有MM

不过话说回来,我无法表达他本人的意思,估计还是得等他本人来.......
awperpvip 2010-01-06
  • 打赏
  • 举报
回复
不方便上网...不好说啊?是mm吗?
((CXXApp*)AfxGetApp())->m_XXX
hfcarrey 2010-01-06
  • 打赏
  • 举报
回复
深入浅出MFC 有详细描述
cdsnpeter 2010-01-06
  • 打赏
  • 举报
回复
AFX_MODULE_STATE类的定义:CWinApp* m_pCurrentWinApp;
CWinApp的构造函数中:pModuleState->m_pCurrentWinApp = this;
AfxGetApp:_AFXWIN_INLINE CWinApp* AFXAPI AfxGetApp()
{ return AfxGetModuleState()->m_pCurrentWinApp; }
vclongking 2010-01-05
  • 打赏
  • 举报
回复
我觉得就是通过AfxGetApp得到其对象指针 直接转换就行了
和楼上的意思差不多
zyq5945 2010-01-05
  • 打赏
  • 举报
回复
SDI,MDI,MFC console等都是CWinApp类或者其派生类变量实例名称都是theApp的吧.我是每见过其他的.
zyq5945 2010-01-05
  • 打赏
  • 举报
回复
全局对象的名字不一定是theApp,它是怎么自动被全局函数得到的呢?
CWinApp* AFXAPI AfxGetApp( );
AfxGetApp获得基类指针,再自己强制转换为相对应的派生类指针的吧.
嗷嗷叫的老马 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zyq5945 的回复:]
没想的那么复杂,就按原始的C函数来理解就可以.
C/C++ code//其他文件定义的全局函数CWinApp* afxgetapp()
{return&theApp;
}//主要源文件,包含定义了afxgetapp的头文件CWinApp theApp;int main()
{
CWinApp*pApp= afxgetapp();return0;
}

[/Quote]
我想,他应该就是想知道return &theApp这一句里,theApp怎么来的吧.....

看他的原话,"全局对象的名字不一定是theApp,它是怎么自动被全局函数得到的呢?",应该是这意思了...
嗷嗷叫的老马 2010-01-05
  • 打赏
  • 举报
回复
这个....确实,我那个朋友现在没办法上网,我没办法表达清楚他的意思.....
  • 打赏
  • 举报
回复
估计还是本人问比较好。。。。其他人问很难表述本意
捧剑者 2010-01-05
  • 打赏
  • 举报
回复
CWinApp的全局对象建构函数中将自己的地址赋值给AFX_MODULE_STATE类的对象的一个数据成员了。
afxGetApp()就是返回这个数据成员的值。
crystal_dark 2010-01-05
  • 打赏
  • 举报
回复
学习
zyq5945 2010-01-05
  • 打赏
  • 举报
回复
没想的那么复杂,就按原始的C函数来理解就可以.
//其他文件定义的全局函数
CWinApp * afxgetapp()
{
return &theApp;
}

//主要源文件,包含定义了afxgetapp的头文件
CWinApp theApp;
int main()
{
CWinApp *pApp = afxgetapp();
return 0;
}

加载更多回复(3)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧