今天自己动手写个小程序,巩固之前看书学的东西,遇到一个问题很奇怪,很不理解!
请看代码,很简单,就是写个有菜单项的对话框!
RC文件:
#include <resource.h>
#define ICO_MAIN 0x1000
#define DLG_MAIN 0x1000
#define IDG_PUSHME 0x1001
#define IDM_MAIN 0x1000
//#define IDM_OPTION 0x0002
#define IDM_OPENFILE 0x1001
#define IDM_SAVEAS 0x1002
#define IDM_SETPAGE 0x1003
#define IDM_QUIT 0x1004
//#define IDM_CHECKSTATUS 0x0007
#define IDM_SERCHCHAR 0x1005
#define IDM_EXCHCHAR 0x1006
#define IDM_CHOSFONT 0x1007
#define IDM_CHOSCOLOR 0x1008
ICO_MAIN ICON "my.ico"
DLG_MAIN DIALOG 50,50,200,150
MENU IDM_MAIN
STYLE WS_CAPTION|WS_SYSMENU|WS_VISIBLE|WS_POPUP|DS_MODALFRAME
CAPTION "通用对话框组件范例"
FONT 9,"宋体"
{
PUSHBUTTON "点我",IDG_PUSHME,80,80,35,15,WS_VISIBLE
}
IDM_MAIN menu
BEGIN
POPUP "文件"
BEGIN
menuitem "打开文件", IDM_OPENFILE
menuitem "另存为", IDM_SAVEAS
menuitem "退出", IDM_QUIT
END
POPUP "查看"
BEGIN
menuitem "查找字符串", IDM_SERCHCHAR
menuitem "替换字符串", IDM_EXCHCHAR
menuitem "选择字体", IDM_CHOSFONT
menuitem "选择颜色", IDM_CHOSCOLOR
END
END
源文件如下:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;include Comdlg32.inc
;includelib Comdlg32.lib
ICO_MAIN equ 1000h
IDM_MAIN equ 1000h
DLG_MAIN equ 1000h
IDG_PUSHME equ 1001h
IDM_OPENFILE equ 1001h
IDM_SETPAGE equ 1002h
IDM_QUIT equ 1003h
IDM_CHECKSTATUS equ 1004h
IDM_SERCHCHAR equ 1005h
IDM_EXCHCHAR equ 1006h
IDM_CHOSFONT equ 1007h
IDM_CHOSCOLOR equ 1008h
.data?
hInstance dd ?
.code
_DlgProc proc uses ebx esi edi hWnd,uMsg,wParam,lParam
mov eax,uMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_INITDIALOG
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_DlgProc endp
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _DlgProc,NULL
invoke ExitProcess,NULL
end start
如图所示代码,可以正常生成文件,但是无法运行!
我发现只要把:
1.rc文件中,定义的值的16进制前缀0x去掉,
2.把asm文件中,定义的值得16进制后缀h去掉,
就可以正常运行了!可是书本上说的是,rc文件中应该注意书写方式,16进制要写成0x开头,asm文件中要写成结尾带h,为什么在这里反而要将0x和h去掉才可以正常运行呢?我是win7 64位系统
------解决方案--------------------
好像就是在对话框定义里的 MENU 项才有这个问题,其它如 STYLE 或里面空间的定义时使用十六进制是没有问题的。
Masm32 用的也是 c 里面的 rc ,这个没有差异;我试过 rc 5.00.... 和 vc2008 里的 6.0.57... 结果都一样。
收徒之说言重了,有什么问题大家一起探讨吧。
------解决方案--------------------
我试了一下,确实有这个问题,用VC中的RC 6.1.7600.16385编译楼主的资源再连接到exe,程序启动后直接终止了。但是用Borland的brc 5.20编译资源再连接到exe就一切正常。不知道ms怎么搞的。