之前一直没有确切地弄明白在主程序中进行等值定义的含义和作用。今天在读汇编语言相关书籍的例子时自己总结了一下,在此记录如下:
首先来看MenuHelp函数:
invoke MenuHelp,uMsg,wParam,lParam,hMenu,hInstance,hwndStatus,lpwIDs
显然这个逻辑在这里是这样实现的:在收到windows对于菜单类型的描述消息后,程序首先寻找程序中调用函数的对应参数, 在此是该函数参数IpwIDs的第二个双字。lpwIDs指向一个包含4个双字的数组,用来指定函数装入的字符串的ID值基数,第一个双字指定命令菜单项的基数,第二个双字指定弹出式菜单的基数。
本例中参数IpwIDs的值设置为dwMenuHelp dd 0,IDM_MENUHELP,0,0
所以本例中第二个双字就是IDM_MENUHELP。然后基数+菜单ID就等于需要显示的字符串ID。
而在程序代码中做的等值定义IDM_MENUHELP=1300. 由于弹出式菜单没有ID,系统按照菜单的索引号(在资源脚本中菜单段中popup是第几个索引就是几)加上基数当做字符串ID。
然后程序计算windows系统返回的索引号+基数的值后去资源脚本中的字符串列表——也就是stringtable discardable段中寻找提示信息。因为IDM_MENUHELP在资源脚本中已经做了等值定义,因此如果windows返回的值是1301,则在字符串列表中找到IDM_MENUHELP+1。
注:例子为《WIN32汇编语言程序设计》9.2的STATUSBAR,相关代码在附带光盘文件中可以查找到。