资源可以用VC之类的生成,然后拷贝出来。
例如:每一个MFC工程都有一个resource.h,没有做任何修改时,这个resource.h文件是原来自带的。当对资源进行过修改添加之类的时,新添加的资源的ID都会被加入的这个工程的resource.h中。在Win32汇编的RC文件中,开头包含的那个resource.h没有做过任何修改,所以要把新添加的资源的ID用#define宏添加进来。
#include <resource.h> #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对于ASM文件,这个自然是要动动手写了。
对于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 gszCaption db 'Caption',0 gszText db 'Text',0 .data? ghInstance dd ? .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