使用wxWidgets编译的Windows Mobile程序运行时提示“SHCreateMenuBar failed”错误的解决方法
故障现象:
使用wxWidgets,在windows平台下编译下运行成功;但编译用于WindowsMobile平台的程序时,运行时提示在调用"tbarwce.cpp"中的“wxToolMenuBar::MSWCreateToolbar”函数时出现“SHCreateMenuBar failed”错误。因而无法显示程序的菜单。
解决方法:
通过网络查找这个错误的解决方法,最后都没有明确指出解决问题的方法。通过MSDN查找“SHCreateMenuBar”函数的说明,并阅读wxWidgets的原代码及示例程序,发现有几个地方可能造成这个错误:
- 程序必须要建立资源文件,且在其中包含“wx/msw/wx.rc”
- 在编译Windows Mobile程序时,要在资源编译选项与程序编译选项中均要设置“_WIN32_WCE”预编译选项
原因分析:
因为“SHCreateMenuBar”函数调用时要传入菜单资源的id号,而这个id号在程序中当有“_WIN32_WCE”预编译选项时用的是“5000”(magic number)。 在"wx.rc"文件中,当设置“_WIN32_WCE”预编译选项时,会"#include "wx/msw/wince/wince.rc"",在“wince.rc”文件中包含了id为“5000”的菜单资源,同样使用magic number。如果未成功地设置前面所述的两个解决要点,在调用“SHCreateMenuBar”时就会出现前文所述的错误。
其它经验:
这个问题又一次验证了程序编码时的经验,不要使用 magic number,如果前文中的“5000”是用符号来表示的,那么在编译时就可能会现出符号无法找到错误,排错的过程就会更有针对性,也更加快捷。
/*-------------------------------------------
* (c)2008 easyti, www.easyti.cn
* Make simple things easy.
*------------------------------------------*/