版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Win32汇编语言教程作者:TBsoft- 一、引言Win32应用程序一般使用C语言编程,但是在某些需要进行深层编程的情况下,例如Win32应用程序执行机制分析、病毒清除、加密解密等深层编程,或者对于某些速度要求较高的程序,需要使用汇编语言(甚至机器语言)直接编写Win32应用程序。Win32应用程序虽然和其他32位应用程序(例如32位保护模式DOS程序)一样可以使用386汇编语言和保护模式编程,但是Win32应用程序的执行机制与其他32位应用程序有一定的差别,例如消息循环、动态链接等,Win32汇编语言也有其特殊的编程方式。目前国内极少看到有关Win32汇编语言的资料,市面上的汇编语言书籍一
2、般只介绍DOS实模式汇编语言和386保护模式汇编语言,金山公司的深入Windows编程一书虽然介绍了使用汇编语言写Windows应用程序的方法,可惜该书只介绍了Win16汇编语言。为了使大家能对Win32汇编语言的基本编程方法有一定的了解,近日得闲,笔者编写了本教程,旨在抛砖引玉,如果本教程能够带领你走进神秘的Win32汇编语言世界,笔者心愿足矣。使用本教程,要求读者具有C语言编写Win32应用程序(Win32SDK编程)的基础。二、进行Win32汇编语言编程的基本软件进行Win32汇编语言编程,应该准备下列基本软件:1、MASM 6.11以上版本的汇编器MASM是Microsoft公司的汇编
3、器,这是最基本的软件,必需MASM 6.11以上版本才能够汇编Win32汇编语言源程序。不过进行Win32汇编语言编程不必要全套的MASM 6.11,只要一个ML.EXE文件就可以了,Windows 95 DDK中带有MASM 6.11c的ML.EXE文件,Windows 98 DDK中带有MASM 6.11d的ML.EXE文件,都可以使用。Turbo MASM 5.0(TASM)是Borland公司的汇编器,也可以用来汇编Win32汇编语言源程序,但是TASM的部分语法与MASM不同,用于MASM的Win32汇编语言源程序可能需要修改后才能用TASM汇编。本教程中的所有Win32汇编语言源程
4、序都基于MASM。2、Win32SDK进行Win32汇编语言编程需要用到Win32SDK中的资源编译器(RC.EXE)和连接器(LINK.EXE),还需要用到Win32SDK中的引入库文件(KERNEL32.LIB、USER32.LIB、GDI32.LIB等)。如果没有Win32SDK,Platform SDK也可以,还可以安装Visual C+ 2.0以上版本的Visual C+,笔者使用的是Visual C+ 6.0。Borland C+ 4.0以上版本的Borland C+也可以使用,只是资源编译器和连接器的文件名不同,分别是BRC.EXE(BRC32.EXE)和TLINK.EXE(TL
5、INK32.EXE),选项也不尽相同,另外Borland C+不支持COFF格式的OBJ文件,汇编时不能使用/coff选项。3、汇编语言编辑器一个普通的文本编辑器,用于编辑Win32汇编语言源程序。EDIT、PWB等都可以,Visual C+等编程语言中的编辑器也可以,甚至WORD、WPS 97等可以编辑文本文件的字处理软件都可以,不过笔者推荐使用ASMEDIT,这是一个专用的汇编语言编辑器,效果非常好。Win32汇编语言一般使用命令行方式汇编连接,经过一定的设置也可以在某些集成环境(PWB、Visual C+、ASMEDIT等)下汇编连接,还可以使用NMAKE工具,不过本教程中只使用命令行方
6、式汇编连接,也不使用NMAKE工具。三、ANSI字符集API与UNICODE字符集APIWin32 API中凡是与字符有关的API都有两种不同的类型:ANSI字符集API和UNICODE字符集API,分别对应ANSI字符和UNICODE字符,Windows NT支持两种类型的API,Windows 9598只支持ANSI字符集API。在WINDOWS.H头文件和其他Win32 API定义头文件中,凡是与字符有关的API都有两种不同的定义,ANSI字符集API以API名称加字符“A”表示,UNICODE字符集API以API名称加字符“W”表示,并使用条件编译和宏定义实现自动根据当前字符集使用对应
7、的API定义,例如GetModuleHandle函数的定义(包括在WINBASE.H头文件中):WINBASEAPIHMODULEWINAPIGetModuleHandleA( LPCSTR lpModuleName );WINBASEAPIHMODULEWINAPIGetModuleHandleW( LPCWSTR lpModuleName );#ifdef UNICODE#define GetModuleHandle GetModuleHandleW#else#define GetModuleHandle GetModuleHandleA#endif / !UNICODE与字符有关的数据结
8、构也有类似的定义。本教程考虑到汇编语言使用条件汇编会导致不太直观,全部使用ANSI字符集API,这样也可以保证在Windows 9598和Windows NT环境下的兼容性,所以本教程中许多API名称和数据结构的名称都加有“A”字符,读者可以方便地改用UNICODE字符集API。四、一个简单的Win32汇编语言程序读者可能一听到“汇编语言”四个字就觉得十分头疼!汇编语言给人的第一印象就是一大堆难以看懂又不直观的指令,而且不结构化,大量的标号、无条件跳转指令(JMP)和条件跳转指令让你难以看懂程序;过程(或者函数)的调用参数传递又不直观,要么直接使用寄存器传递参数,不符合结构化程序设计原则;要么
9、使用堆栈传递参数,又不能有效地检验参数类型想必Win32汇编语言更麻烦吧!还好,MASM 6.0以上版本的汇编器提供了很多结构化汇编语言伪指令,可以方便地实现汇编语言结构化程序设计,当你看完本教程以后,你可能会感觉到:Win32汇编语言并不比C语言麻烦多少。(如果读者看不懂本教程中的汇编语言源程序也不要紧,可以对照MASM 6.11的帮助看)和C语言Win32编程需要WINDOWS.H头文件和其他Win32 API定义头文件定义常量、数据结构和API一样,Win32汇编语言也需要包含文件(INC文件)定义常量、数据结构和API。不过笔者找了很长时间也没有找到一个完整的可用于Win32汇编语言的
10、WINDOWS.INC文件或者WIN32.INC文件(倒是找到了用于Win16汇编语言的WINDOWS.INC文件),Turbo MASM 5.0中提供的WIN32.INC文件也不完整,只能用于自带的WAP32例子程序,而且与MASM 6.11不太兼容(听说NASM中有完整的WIN32.INC文件,可惜没有找到,也不知道与MASM 6.11是否兼容)。笔者只好自己定义常量、数据结构和API(根据WINDOWS.H头文件和其他Win32 API定义头文件定义),不过这倒带来了不少好处可以更好地了解Win32汇编语言的编程方法和原理。笔者编写了一个简单的Win32汇编语言程序,该程序的功能很简单:
11、在屏幕上显示一个消息框。本程序只调用了两个API函数:MessageBox函数和ExitProcess函数,程序如下:包含文件(MSGBOX.INC):UINT TYPEDEF DWORDLPSTR TYPEDEF PTR BYTELPCSTR TYPEDEF LPSTRPVOID TYPEDEF PTRHANDLE TYPEDEF PVOIDHWND TYPEDEF HANDLEMB_ICONINFORMATION = 00000040hMB_OK = 00000000hMessageBoxA PROTO stdcall, :HWND,:LPCSTR,:LPCSTR,:UINTExitPro
12、cess PROTO stdcall, :UINT源程序(MSGBOX.ASM):.386p.MODEL flat,stdcallINCLUDE MSGBOX.INC.STACK 4096.DATAWindowTitle BYTE 'MsgBox',0Message1 BYTE 'This is a simple MessageBox Win32 application.',0.CODE_start:INVOKE MessageBoxA,0,ADDR Message1,ADDR WindowTitle,MB_ICONINFORMATION or MB_OKINV
13、OKE ExitProcess,0PUBLIC _startEND汇编连接本程序的命令如下:ml /c /coff /Cp msgbox.asmlink /subsystem:windows /entry:_start msgbox.obj kernel32.lib user32.lib汇编命令中的/c选项表示只汇编,不自动连接;/coff选项表示生成COFF格式的OBJ文件(如果使用Borland的连接器不能使用/coff参数);/Cp选项表示标识符区分大小写。连接命令中/subsystem:windows选项表示连接器生成普通Windows可执行文件;/entry:_start选项表示程序
14、入口点是_start标识符。连接时连接KERNEL32.LIB和USER32.LIB引入库。运行汇编连接后生成的MSGBOX.EXE文件,屏幕上将显示出一个消息框,消息框的标题是“MsgBox”,消息框中的字符串是“This is a simple MessageBox Win32 application.”。Win32汇编语言源程序应该由.386p伪指令和.MODEL flat,stdcall伪指令开始,指示汇编器汇编386保护模式指令,并使用平坦内存模式(Win32内存模式)和stdcall函数调用方式(Win32标准函数调用方式)。PROTO伪指令定义函数原型(与C语言中函数原型的定义相
15、似),可以定义函数名、调用方式和参数,INVOKE伪指令调用由PROTO伪指令定义的函数,可以方便地传递参数和检查参数类型。MSGBOX.INC文件中使用PROTO伪指令定义API函数,MSGBOX.ASM文件中使用INVOKE伪指令调用API函数,可见MASM 6.0以上版本的汇编器提供的结构化汇编语言伪指令大大简化了Win32汇编语言编程(本程序一条汇编语言指令也没有用到)。本程序调用了MessageBox函数显示消息框以后,调用了ExitProcess函数终止程序的执行,ExitProcess函数的作用是终止当前进程。五、显示一个窗口的Win32汇编语言程序学习过Win32SDK编程的读
16、者编写的第一个应用程序可能就是显示一个窗口的C语言程序,笔者也编写了这样一个C语言程序,该程序文件名为SIMPLE.C,程序如下:#include static char szWindowClass="SIMPLE"LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)WNDCLASSEXA w
17、cex;HWND hWnd;MSG msg;if(!hPrevInstance) wcex.cbSize=sizeof(WNDCLASSEXA); wcex.style=CS_HREDRAW|CS_VREDRAW; wcex.cbClsExtra=0; wcex.cbWndExtra=0; wcex.lpfnWndProc=WndProc; wcex.hInstance=hInstance; wcex.hIcon=LoadIconA(hInstance,IDI_APPLICATION); wcex.hCursor=LoadCursorA(0,IDC_ARROW); wcex.hbrBackgr
18、ound=(HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName=NULL; wcex.lpszClassName=szWindowClass; wcex.hIconSm=LoadIconA(hInstance,IDI_APPLICATION); if(!RegisterClassExA(&wcex) return FALSE;hWnd=CreateWindowExA(0,szWindowClass,"SIMPLE",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFA
19、ULT,CW_USEDEFAULT, 0,0,hInstance,NULL);if(!hWnd) return FALSE;ShowWindow(hWnd,nShowCmd);UpdateWindow(hWnd);while(GetMessageA(&msg,0,0,0) TranslateMessage(&msg); DispatchMessageA(&msg);return msg.wParam;LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)HDC hDC;PA
20、INTSTRUCT ps;switch(message)case WM_PAINT: hDC=BeginPaint(hWnd,&ps); EndPaint(hWnd,&ps); return 0;case WM_DESTROY: PostQuitMessage(0); return 0;default: return DefWindowProcA(hWnd,message,wParam,lParam);return -1;本程序与一般的显示一个窗口的C语言程序基本相同,只是只使用ANSI字符集。现在笔者用Win32汇编语言程序实现本程序的功能,程序如下:包含文件(SIMPLE.
21、INC):UINT TYPEDEF DWORDLONG TYPEDEF DWORDLPSTR TYPEDEF PTR BYTELPCSTR TYPEDEF LPSTRPVOID TYPEDEF PTRLPVOID TYPEDEF PVOIDHANDLE TYPEDEF PVOIDHINSTANCE TYPEDEF HANDLEHWND TYPEDEF HANDLEHMENU TYPEDEF HANDLEHDC TYPEDEF HANDLEHGDIOBJ TYPEDEF HANDLEHICON TYPEDEF HANDLEHCURSOR TYPEDEF HANDLEHBRUSH TYPEDEF
22、HANDLEtagWNDCLASSEXA STRUCTcbSize UINT ?style UINT ?lpfnWndProc DWORD ?cbClsExtra DWORD ?cbWndExtra DWORD ?hInstance DWORD ?hIcon DWORD ?hCursor DWORD ?hbrBackground DWORD ?lpszMenuName DWORD ?lpszClassName DWORD ?hIconSm DWORD ?tagWNDCLASSEXA ENDSWNDCLASSEXA TYPEDEF tagWNDCLASSEXAtagPOINT STRUCTx L
23、ONG ?y LONG ?tagPOINT ENDSPOINT TYPEDEF tagPOINTtagMSG STRUCTmessage UINT ?wParam DWORD ?lParam DWORD ?time DWORD ?pt POINT <>tagMSG ENDSMSG TYPEDEF tagMSGLPMSG TYPEDEF PTR MSGtagRECT STRUCTleft LONG ?top LONG ?right LONG ?bottom LONG ?tagRECT ENDSRECT TYPEDEF tagRECTtagPAINTSTRUCT STRUCThdc D
24、WORD ?fErase DWORD ?rcPaint RECT <>fRestore DWORD ?fIncUpdate DWORD ?rgbReserved BYTE 32 DUP(?)tagPAINTSTRUCT ENDSPAINTSTRUCT TYPEDEF tagPAINTSTRUCTLPPAINTSTRUCT TYPEDEF PTR PAINTSTRUCTNULL = 0TRUE = 0ffffffffhFALSE = 0SW_SHOWDEFAULT = 10CS_HREDRAW = 0002hCS_VREDRAW = 0001hIDI_APPLICATION = 32
25、512IDC_ARROW = 32512COLOR_WINDOW = 5WS_OVERLAPPEDWINDOW = 00cf0000hCW_USEDEFAULT = 80000000hWM_PAINT = 000fhWM_DESTROY = 0002hGetModuleHandleA PROTO stdcall, :LPCSTRGetCommandLineA PROTO stdcallExitProcess PROTO stdcall, :UINTLoadIconA PROTO stdcall, :HINSTANCE,:LPCSTRLoadCursorA PROTO stdcall, :HIN
26、STANCE,:LPCSTRRegisterClassExA PROTO stdcall, :PTR WNDCLASSEXACreateWindowExA PROTO stdcall, :DWORD,:LPCSTR,:LPCSTR,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:HWND,:HMENU,:HINSTANCE,:LPVOIDShowWindow PROTO stdcall, :HWND,:DWORDUpdateWindow PROTO stdcall, :HWNDGetMessageA PROTO stdcall, :LPMSG,:HWND,:UINT,:
27、UINTTranslateMessage PROTO stdcall, :PTR MSGDispatchMessageA PROTO stdcall, :PTR MSGBeginPaint PROTO stdcall, :HWND,:LPPAINTSTRUCTEndPaint PROTO stdcall, :HWND,:PTR PAINTSTRUCTPostQuitMessage PROTO stdcall, :DWORDDefWindowProcA PROTO stdcall, :HWND,:UINT,:DWORD,:DWORD源程序(SIMPLE.ASM):.386p.MODEL flat
28、,stdcallINCLUDE SIMPLE.INCWinMain PROTO stdcall, :HINSTANCE,:HINSTANCE,:LPSTR,:DWORD.STACK 4096.DATAWindowClass BYTE 'SIMPLE',0WindowTitle BYTE 'SIMPLE',0hInst1 HINSTANCE 0lpCmdLine1 LPSTR 0.CODE_start:INVOKE GetModuleHandleA,NULLmov hInst1,eaxINVOKE GetCommandLineAmov lpCmdLine1,eax
29、INVOKE WinMain,hInst1,NULL,lpCmdLine1,SW_SHOWDEFAULTINVOKE ExitProcess,eax WinMain PROC hInst:HINSTANCE,hPrevInst:HINSTANCE,lpCmdLine:LPSTR,nShowCmd:DWORDLOCAL wcex:WNDCLASSEXALOCAL hWnd:HWNDLOCAL msg:MSG.IF !hPrevInst mov wcex.cbSize,SIZEOF WNDCLASSEXA mov wcex.style,CS_HREDRAW or CS_VREDRAW mov wc
30、ex.cbClsExtra,0 mov wcex.cbWndExtra,0 mov wcex.lpfnWndProc,OFFSET WndProc mov eax,hInst mov wcex.hInstance,eax INVOKE LoadIconA,hInst,IDI_APPLICATION mov wcex.hIcon,eax INVOKE LoadCursorA,0,IDC_ARROW mov wcex.hCursor,eax mov wcex.hbrBackground,COLOR_WINDOW+1 mov wcex.lpszMenuName,NULL mov wcex.lpszC
31、lassName,OFFSET WindowClass INVOKE LoadIconA,hInst,IDI_APPLICATION mov wcex.hIconSm,eax INVOKE RegisterClassExA,ADDR wcex .IF !eax mov eax,FALSE ret .ENDIF.ENDIFINVOKE CreateWindowExA,0,ADDR WindowClass,ADDR WindowTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,
32、hInst,NULLmov hWnd,eax.IF !eax mov eax,FALSE ret.ENDIFINVOKE ShowWindow,hWnd,nShowCmdINVOKE UpdateWindow,hWnd.WHILE TRUE INVOKE GetMessageA,ADDR msg,0,0,0 .BREAK .IF !eax INVOKE TranslateMessage,ADDR msg INVOKE DispatchMessageA,ADDR msg.ENDWmov eax,msg.wParamretWinMain ENDPWndProc PROC hWnd:HWND,mes
33、sage:UINT,wParam:DWORD,lParam:DWORDLOCAL hDC:HDCLOCAL ps:PAINTSTRUCT.IF message=WM_PAINT INVOKE BeginPaint,hWnd,ADDR ps mov hDC,eax INVOKE EndPaint,hWnd,ADDR ps mov eax,0 ret.ELSEIF message=WM_DESTROY INVOKE PostQuitMessage,0 mov eax,0 ret.ELSE INVOKE DefWindowProcA,hWnd,message,wParam,lParam ret.EN
34、DIFmov eax,0ffffffffhretWndProc ENDPPUBLIC _startEND汇编连接本程序的命令如下:ml /c /coff /Cp simple.asmlink /subsystem:windows /entry:_start simple.obj kernel32.lib user32.lib gdi32.lib运行汇编连接后生成的SIMPLE.EXE文件,屏幕上将显示出一个标准的窗口,窗口的标题是“SIMPLE”。学习过Win32SDK编程的读者都知道,Win32应用程序的入口点是WinMain函数,实际上WinMain函数是被C语言的初始化和结束代码调用的,
35、Win32应用程序的真正入口点和DOS应用程序没有什么区别,都是在文件头中指定的应用程序起始点。Win32汇编语言没有C语言的初始化和结束代码,必须自己编写初始化和结束代码调用WinMain函数(过程),WinMain函数的原型是:int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd);WinMain函数有4个参数,分别是:hInstance应用程序当前实例的句柄,可以通过调用GetModuleHandle函数获取.hPrevInstance应用程序前一个实例的句柄
36、,Win32中当前地址空间中不会有应用程序的其他实例在运行,该参数通常设置为NULL(提供该参数只是便于移植Win16应用程序源程序)。lpCmdLine命令行参数,可以通过调用GetCommandLine函数获取。nShowCmd主窗口的显示状态,可以设置成SW_SHOWDEFAULT(缺省状态)。本程序的初始化和结束代码如下:INVOKE GetModuleHandleA,NULLmov hInst1,eaxINVOKE GetCommandLineAmov lpCmdLine1,eaxINVOKE WinMain,hInst1,NULL,lpCmdLine1,SW_SHOWDEFAULT
37、INVOKE ExitProcess,eax Win32标准函数调用方式,函数返回值通过EAX寄存器返回。可见本程序的初始化和结束代码很简单,只是调用GetModuleHandle函数获取应用程序当前实例的句柄,调用GetCommandLine函数获取命令行参数,然后调用WinMain函数(过程),WinMain函数返回后调用ExitProcess函数终止程序的执行。将本程序与SIMPLE.C程序比较,可以看出程序结构十分相似,本程序大量使用了MASM 6.0以上版本的汇编器提供的结构化汇编语言伪指令,并不比C语言麻烦多少。六、资源在Win32汇编语言程序中的使用资源在Win32应用程序中是很
38、重要的,笔者编写了一个使用资源的C语言程序,该程序实现了菜单和一个“About”对话框,程序如下:源程序(GENERIC.C):#include #include "resource.h"static HINSTANCE hInst;static char szWindowClass="GENERIC"LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);BOOL CALLBACK AboutDlgProc(HWND hDlg,UINT message,W
39、PARAM wParam,LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)WNDCLASSEXA wcex;HWND hWnd;MSG msg;hInst=hInstance;if(!hPrevInstance) wcex.cbSize=sizeof(WNDCLASSEXA); wcex.style=CS_HREDRAW|CS_VREDRAW; wcex.cbClsExtra=0; wcex.cbWndExtra=0; wcex.
40、lpfnWndProc=WndProc; wcex.hInstance=hInstance; wcex.hIcon=LoadIconA(hInstance,IDI_APPLICATION); wcex.hCursor=LoadCursorA(0,IDC_ARROW); wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName=MAKEINTRESOURCE(IDR_MAINMENU); wcex.lpszClassName=szWindowClass; wcex.hIconSm=LoadIconA(hInstance,IDI_
41、APPLICATION); if(!RegisterClassExA(&wcex) return FALSE;hWnd=CreateWindowExA(0,szWindowClass,"Generic",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, 0,0,hInstance,NULL);if(!hWnd) return FALSE;ShowWindow(hWnd,nShowCmd);UpdateWindow(hWnd);while(GetMessageA(
42、&msg,0,0,0) TranslateMessage(&msg); DispatchMessageA(&msg);return msg.wParam;LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)HDC hDC;PAINTSTRUCT ps;switch(message)case WM_COMMAND: switch(LOWORD(wParam) case IDM_EXIT: SendMessageA(hWnd,WM_CLOSE,0,0); return 0;
43、case IDM_ABOUT: DialogBoxParamA(hInst,MAKEINTRESOURCE(IDD_ABOUT),hWnd,(DLGPROC)AboutDlgProc,0); return 0; default: return DefWindowProcA(hWnd,message,wParam,lParam); case WM_PAINT: hDC=BeginPaint(hWnd,&ps); EndPaint(hWnd,&ps); return 0;case WM_DESTROY: PostQuitMessage(0); return 0;default: r
44、eturn DefWindowProcA(hWnd,message,wParam,lParam);return -1;BOOL CALLBACK AboutDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)switch(message)case WM_INITDIALOG: return TRUE;case WM_COMMAND: if(LOWORD(wParam)=IDOK)|(LOWORD(wParam)=IDCANCEL) EndDialog(hDlg,LOWORD(wParam); return TRUE; retur
45、n FALSE;default: return FALSE;资源源文件(GENERIC.RC,使用Visual C+ 6.0建立):/Microsoft Developer Studio generated resource script./#include "resource.h"#define APSTUDIO_READONLY_SYMBOLS/ Generated from the TEXTINCLUDE 2 resource./#include "afxres.h"/#undef APSTUDIO_READONLY_SYMBOLS/ Chines
46、e (P.R.C.) resources#if !defined(AFX_RESOURCE_DLL) | defined(AFX_TARG_CHS)#ifdef _WIN32LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED#pragma code_page(936)#endif /_WIN32/ Menu/IDR_MAINMENU MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&Exit", IDM_EXIT END POPUP
47、"&Help" BEGIN MENUITEM "&About.", IDM_ABOUT ENDEND#ifdef APSTUDIO_INVOKED/ TEXTINCLUDE/1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h0"END2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""rn" "0"END3 TEXTINCLUDE DISCARDAB
48、LE BEGIN "rn" "0"END#endif / APSTUDIO_INVOKED/ Dialog/IDD_ABOUT DIALOG DISCARDABLE 0, 0, 92, 65STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENUCAPTION "About"FONT 9, "宋体"BEGIN LTEXT "Generic V1.0",IDC_STATIC1,20,10,50,10 DEFPUSHBU
49、TTON "OK",IDOK,20,40,50,15END/ DESIGNINFO/#ifdef APSTUDIO_INVOKEDGUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_ABOUT, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 85 TOPMARGIN, 7 BOTTOMMARGIN, 58 ENDEND#endif / APSTUDIO_INVOKED#endif / Chinese (P.R.C.) resources/#ifndef APSTUDIO_INVOKED/ Generate
50、d from the TEXTINCLUDE 3 resource./#endif / not APSTUDIO_INVOKED资源头文件(RESOURCE.H,Visual C+ 6.0自动建立):/NO_DEPENDENCIES/ Microsoft Developer Studio generated include file./ Used by GENERIC.rc/#define IDR_MAINMENU 101#define IDD_ABOUT 102#define IDC_STATIC1 1000#define IDM_EXIT 40001#define IDM_ABOUT 40
51、002/ Next default values for new objects/ #ifdef APSTUDIO_INVOKED#ifndef APSTUDIO_READONLY_SYMBOLS#define _APS_NEXT_RESOURCE_VALUE 103#define _APS_NEXT_COMMAND_VALUE 40003#define _APS_NEXT_CONTROL_VALUE 1001#define _APS_NEXT_SYMED_VALUE 101#endif#endif本程序与一般Win32编程资料中的GENERIC程序基本相同,只是只使用ANSI字符集。现在笔者用Win32汇编语言程序实现本程序的功能,程序如下:包含文件(GENERIC.INC):UINT TYPEDEF DW
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年保洁卫生承包协议书
- 九年级语文中考文言虚词专项复习公开课一等奖创新教学设计
- 《杨氏之子》公开课一等奖创新教学设计
- 雇佣合同中的试用期规定
- 委托加工协议书案例参考
- 电影导演聘请合同范本
- 显示器代理协议书参考
- 珠海市企业集体合同参考
- 门禁报警课程设计
- 广告代理合同如何约定费用和结算
- 现实与理想-西方古典绘画 课件-2023-2024学年高中美术人美版(2019)美术鉴赏
- 认识经济全球化 说课课件-2023-2024学年高中政治统编版选择性必修一当代国际政治与经济
- 2024网站渗透测试报告
- 2023-2024学年七年级上册语文期中考试高频考点13 写作实践解析版
- 九年级上期中考试质量分析
- DB-T29-139-2015天津市房屋修缮工程质量验收标准
- 消防安全知识宣讲会
- 金融服务创新联合体协议书
- 《共情的力量》课件
- 单词默写表(素材)-2023-2024学年人教PEP版英语五年级上册
- 发票勾选认证培训课件
评论
0/150
提交评论