作者在 2008-11-17 10:10:51 发布以下内容
有些朋友在学习罗云彬的<Windows环境下32位汇编语言程序设计>一书第五章的时候,对Menu 例子程序中的关于全局变量与局部变量的用法有些疑惑.
如,在Menu 例子程序中,hSubMenu 这个子菜单句柄变量,如果放在了局部变量中(即窗口过程中),程序正常,却没有弹出菜单;而改为放在全局变量中,才弹出菜单.
为什么?
我在学习该书第五章的"使用图标和光标"内容的时候,也遇到了类似的问题:如果,把hIconBig,hIconSmall,hCur1,hCur2 这几个句柄变量都设为局部变量,则程序虽然编译通过且运行了,但所加载的图标和光标都没有起作用!将它们改成全局变量就可以了.
于是,我用BAIDU搜了一下,在看雪论坛上看到了这样的话: 全局变量作用于整个程序,一直是存在的,它放在全局变量的内存区;而局部变量则是存在于函数的堆栈区,当函数调用结束后便消失。
原来如此.
子程序(上述的窗口过程,或函数)在被调用的时候,每一次被调用都要开辟新的局部变量的堆栈空间,调用完了之后,就要释放这些空间了.上述例子程序中,hIconBig,hIconSmall,hCur1,hCur2被安排在了子程序中,则子程序收到WM_CREATE后,虽然加载了光标和图标,且取得了它们的句柄.但子程序在收到WM_COMMAND 后,又再次调用,而上次保存在堆栈中的句柄就不见了.
我解决的办法是:把hIconBig,hIconSmall,hCur1,hCur2安排为局部变量也可以.但获取句柄和加载它们的时候,都放在同一个WM_COMMAND消息中就可以了.
听到有位牛人好像说过:他写程序,再大的程序,全局变量一般只有一个!可见十分清楚全局变量和局部变量的区别,及运用方法.
PS:啥时候你也牛一把?!