资源可以用VC之类的生成,然后拷贝出来。
例如:每一个MFC工程都有一个resource.h,没有做任何修改时,这个resource.h文件是原来自带的。当对资源进行过修改添加之类的时,新添加的资源的ID都会被加入的这个工程的resource.h中。在Win32汇编的RC文件中,开头包含的那个resource.h没有做过任何修改,所以要把新添加的资源的ID用#define宏添加进来。
#include <resource.h>对于ASM文件,这个自然是要动动手写了。
#define IDD_DLG 130
#define IDC_BTN_TEST 1001
#define IDI_ICO_HEHE 1002
IDI_ICO_HEHE ICON"hehe.ico"
IDD_DLG DIALOGEX 0, 0, 316, 90
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "尝试对话框"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "确定",IDOK,205,69,50,14
PUSHBUTTON "取消",IDCANCEL,259,69,50,14
PUSHBUTTON "测试",IDC_BTN_TEST,113,18,50,14
END
对于DialogBoxParam的回调函数,一定要写好判断逻辑。这个不比VC里好调试。
另外应用程序实例用的是dd,不过还好写错了编译会有提示。
不要忘了定义一下在RC文件里的控件ID,不过还好没写编译时也会有提示。
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
IDD_DLG equ 130
IDC_BTN_TEST equ 1001
IDI_ICO_HEHE equ 1002
.data
gszCaptiondb'Caption',0
gszTextdb'Text',0
.data?
ghInstancedd?
.code
DlgFunc proc uses ebx edi esi hWnd,wMsg,wParam,lParam
mov eax,wMsg
.if eax==WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax==WM_INITDIALOG
invoke LoadIcon,ghInstance,IDI_ICO_HEHE
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
.elseif eax==WM_COMMAND
mov eax,wParam
.if ax==IDOK
invoke EndDialog,hWnd,NULL
.elseif ax==IDC_BTN_TEST
invoke MessageBox,hWnd,addr gszText,addr gszCaption,MB_OK
.endif
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgFunc endp
start:
invoke GetModuleHandle,NULL
mov ghInstance,eax
invoke DialogBoxParam,ghInstance,IDD_DLG,NULL,addr DlgFunc,NULL
invoke ExitProcess,NULL
end start