求助 关于 深入浅出MFC 书中的一点问题

coyooly 2013-01-23 04:45:38
#define PASCAL _stdcall
struct CRunTimeClass
{
//Attributes
LPCSTR m_lpszClassName;
int m_ObjectSize;
UINT m_wSchema; // Schema number of the loaded class
CObject* (PASCAL* m_pfnCreateObject)(); //NULL => abstract class
static CRunTimeClass* m_pFirstClass; //start of class list
CRunTimeClass* m_pBaseClass; //CRuntimeClass objects linked together in simple list
CRunTimeClass* m_pNextClass; //linked list of registered class
};

菜鸟,在看深入浅出MFC的时候遇到的问题。
搞不懂_stdcall到底是什么,后来百度了下大概有点了解。但仍然对_stdcall的使用很模糊,如上例。求助一下..

还有就是 typedef void (CCmdTarget::*AFX_PMSG)(void);
想问下 这个函数前面问什么有个typedef?这个关键字是干什么的?

最后想问个学MFC的问题,C++学完后有人推荐我便看了这本书,但后来看网上有人说MFC过时什么的,这本书略微看看,了解了解就行。个人感觉MFC挺难得特别是那些程序还有一个一个的函数什么的都是必须要花很多时间才能掌握的,现在就有个问题..到底是怎么学MFC,或者就不学呢???
很困惑啊,希望前辈些给点意见吧
...全文
138 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-01-25
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
4楼代码应纠正为: C/C++ code?123456789int __cdecl a1(int p1,int p2) {return p1+p2;}int __fastcall a2(int p1,int p2) {return p1+p2;}int __stdcall a3(int p1,int p2) {return p1+p2;}int main() {……
Release版对应汇编为
00401000 8B 44 24 08          mov         eax,dword ptr [esp+8]
00401004 8B 4C 24 04          mov         ecx,dword ptr [esp+4]
00401008 03 C1                add         eax,ecx
0040100A C3                   ret
0040100B 90                   nop
0040100C 90                   nop
0040100D 90                   nop
0040100E 90                   nop
0040100F 90                   nop
00401010 8D 04 11             lea         eax,[ecx+edx]
00401013 C3                   ret
00401014 90                   nop
00401015 90                   nop
00401016 90                   nop
00401017 90                   nop
00401018 90                   nop
00401019 90                   nop
0040101A 90                   nop
0040101B 90                   nop
0040101C 90                   nop
0040101D 90                   nop
0040101E 90                   nop
0040101F 90                   nop
00401020 8B 44 24 08          mov         eax,dword ptr [esp+8]
00401024 8B 4C 24 04          mov         ecx,dword ptr [esp+4]
00401028 03 C1                add         eax,ecx
0040102A C2 08 00             ret         8
0040102D 90                   nop
0040102E 90                   nop
0040102F 90                   nop
00401030 CC                   int         3 ;这条指令对应紧跟main后加__asm int 3(为方便定位)
00401031 6A 02                push        2
00401033 6A 01                push        1
00401035 E8 C6 FF FF FF       call        00401000
0040103A 83 C4 08             add         esp,8
0040103D BA 02 00 00 00       mov         edx,2
00401042 B9 01 00 00 00       mov         ecx,1
00401047 E8 C4 FF FF FF       call        00401010
0040104C 6A 02                push        2
0040104E 6A 01                push        1
00401050 E8 CB FF FF FF       call        00401020
00401055 33 C0                xor         eax,eax
00401057 C3                   ret
赵4老师 2013-01-25
  • 打赏
  • 举报
回复
4楼代码应纠正为:
int __cdecl    a1(int p1,int p2) {return p1+p2;}
int __fastcall a2(int p1,int p2) {return p1+p2;}
int __stdcall  a3(int p1,int p2) {return p1+p2;}
int main() {
    a1(1,2);
    a2(1,2);
    a3(1,2);
    return 0;
}
coyooly 2013-01-24
  • 打赏
  • 举报
回复
引用 2 楼 lile1234_show 的回复:
引用 1 楼 lile1234_show 的回复:我觉得学习MFC会让你对界面,对控件有一定的知识。 将来不管在什么平台什么环境,UI是必须可少的,不管是网页还是端,都有UI的存在, button,list,checkbutton,radiobutton等等,这些在哪都是一样。 举例:如果控件满足不了需求,那你自己去继承去实现.. 可能开发中不用MFC,用其它界……
哦,明白了,谢谢啊
赵4老师 2013-01-23
  • 打赏
  • 举报
回复
楼主试写三个功能完全一样的带两个int类型参数返回int的函数a1,a2,a3
__cdecl int a1(int p1,int p2) {return p1+p2;}
__fastcall int a2(int p1,int p2) {return p1+p2;}
__stdcall int a3(int p1,int p2) {return p1+p2;}
int main() {
 a1(1,2);
 a2(1,2);
 a3(1,2);
 return 0;
}
然后 VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
赵4老师 2013-01-23
  • 打赏
  • 举报
回复
typedef void (CCmdTarget::*AFX_PMSG)(void); 在CCmdTarget范围内定义一种类型标识符AFX_PMSG, 该类型是一个指针, 该指针指向一类函数, 该函数无参数,无返回值。
lee_鹿游原 2013-01-23
  • 打赏
  • 举报
回复
引用 1 楼 lile1234_show 的回复:
我觉得学习MFC会让你对界面,对控件有一定的知识。 将来不管在什么平台什么环境,UI是必须可少的,不管是网页还是端,都有UI的存在, button,list,checkbutton,radiobutton等等,这些在哪都是一样。 举例:如果控件满足不了需求,那你自己去继承去实现.. 可能开发中不用MFC,用其它界面库,但是都是一个样,假如你有基础,掌握并不难。 ……
我说的仅是 MFC中的UI部分.. 先解释清楚,并不是整个MFC
lee_鹿游原 2013-01-23
  • 打赏
  • 举报
回复
我觉得学习MFC会让你对界面,对控件有一定的知识。 将来不管在什么平台什么环境,UI是必须可少的,不管是网页还是端,都有UI的存在, button,list,checkbutton,radiobutton等等,这些在哪都是一样。 举例:如果控件满足不了需求,那你自己去继承去实现.. 可能开发中不用MFC,用其它界面库,但是都是一个样,假如你有基础,掌握并不难。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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