第22讲第08章133版_88_060603_Win32汇编语言程序设计

上传人:ni****g 文档编号:571892197 上传时间:2024-08-12 格式:PDF 页数:89 大小:940.06KB
返回 下载 相关 举报
第22讲第08章133版_88_060603_Win32汇编语言程序设计_第1页
第1页 / 共89页
第22讲第08章133版_88_060603_Win32汇编语言程序设计_第2页
第2页 / 共89页
第22讲第08章133版_88_060603_Win32汇编语言程序设计_第3页
第3页 / 共89页
第22讲第08章133版_88_060603_Win32汇编语言程序设计_第4页
第4页 / 共89页
第22讲第08章133版_88_060603_Win32汇编语言程序设计_第5页
第5页 / 共89页
点击查看更多>>
资源描述

《第22讲第08章133版_88_060603_Win32汇编语言程序设计》由会员分享,可在线阅读,更多相关《第22讲第08章133版_88_060603_Win32汇编语言程序设计(89页珍藏版)》请在金锄头文库上搜索。

1、微机原理与接口技术本科课程2006年春季第22讲第22讲南京大学计算机系俞建新主讲2006年2月16日Windows 32 汇编语言程序设计基础提示:本讲内容以自习为主本讲内容不列入课程考核范围主要参考教材:Win32汇编语言实用教程冉林仓编著第一章快速进入Win32 汇编世界2006年3月27日南京大学计算机系 俞建新第22讲 第4页前言?知识基础?汇编语言指令?具备32位Windows API编程的经验?参考网站http:/ 俞建新第22讲 第5页安装和设置汇编语言环境?从MASM主页http:/ Studio安转目录下bin子目录复制nmake.exe到masm32bin目录。2006年

2、3月27日南京大学计算机系 俞建新第22讲 第6页安装和设置汇编语言环境?为了在任何目录下都能进行编译链接,建立一个设置环境变量的批处理文件echo offset include=K:masm32includeset lib=K:masm32lib;K:masm32m32lib;set path=K:masm32bin;K:masm32;%path%pausestart cmd.exe /kehco on注意:编译时需要先将K:更改为实际安装的盘符,例如:C:.BAT文件的内容2006年3月27日南京大学计算机系 俞建新第22讲 第7页安装和设置汇编语言环境?想了解makefile的编写,可以

3、参考“masm32/icztutes”目录下各个例子,下面是一个典型的makefile文件NAME=Frw$(NAME).exe: $(NAME).obj $(NAME).reslink /SUBSYSTEM:WINDOWS /LIBPATH:k:masm32lib $(NAME).obj $(NAME).res$(NAME).res: $(NAME).rcrc $(NAME).rc$(NAME).obj: $(NAME).asmml /c /coff /Cp $(NAME).asm2006年3月27日南京大学计算机系 俞建新第22讲 第8页安装和设置汇编语言环境?这个文件指出了项目名称,编译

4、后可执行文件需要链接的目标文件和资源文件、以及编译采用的命令和选项2006年3月27日南京大学计算机系 俞建新第22讲 第9页Win32 汇编程序的编译目录?下图是一个实际的工作文件夹,.BAT文件和MAKEFILE的路径在编译前需要核实。2006年3月27日南京大学计算机系 俞建新第22讲 第10页创建一个Win32汇编应用程序?例1.1 Hello world应用程序.386.model flat,stdcalloption casemap:noneinclude k:masm32includewindows.incinclude k:masm32includekernel32.incin

5、clude k:masm32includeuser32.incincludelib k:masm32libuser32.libincludelib k:masm32libkernel32.lib.dataMsgCaption db “Hi,Masm32!”,0MsgBoxText db “Win32 Assembly is Great!”,0.codestart:invoke MessageBox,NULL,addr MsgBoxText,ADDR MsgCaption,MB_OKInvoke ExitProcess,NULLend start2006年3月27日南京大学计算机系 俞建新第22

6、讲 第11页创建Win32汇编应用程序的两种方法?从命令行编译可以键入以下的命令:ml.exe /c /coff Helloworld.asmlink /SUBSYSTEM:WINDOWS Helloworld.obj?编写makefile文件NAME=Helloworld$(NAME).exe: $(NAME).obj link /SUBSYSTEM:WINDOWS /LIBPATH:k:masm32lib $(NAME).obj$(NAME).obj: $(NAME).asmml /c /coff /Cp $(NAME).asm运行运行nmake.exe即可完成程序的编译和链接即可完成程序

7、的编译和链接2006年3月27日南京大学计算机系 俞建新第22讲 第12页Win32汇编程序与C+应用程序的比较?例1.3 一个标准的Windows应用程序例子程序(1)“;”是一个注释标志符(2).386是一个汇编伪指令,通过它告诉编译器代码将使用什么指令集。(3).model flat,stdcall用于定义程序的规模(4)option casemap:none语句指出大小写是否敏感(5)WinMain proto:相当于一个函数声明(6)include语句指出了程序使用的头文件(7)includelib语句指出了程序使用的库文件(8).data和.data?是两个定义的数据段,后者数据没

8、有初始化,而且在程序运行时才分配空间(9).const段用于定义一些只读常量(10)code代码段是程序实现最重要的一个节(11)整个代码的实现都是通过SDK API函数的调用实现的(12)用户还需了解LOCAL指令的使用,它相当于C+中局部变量第二章语法基础2006年3月27日南京大学计算机系 俞建新第22讲 第14页结构定义?定义RECT STRUCTleft DWORD ?top DWORD ?right DWORD ?bottom DWORD ?RECT ENDS?声明.datarect1 RECT rect2 RECT 100 DUP()LOCAL Rct:RECT ;Rct是局部变

9、量,“:”是局部变量与结构体的分隔符;LOCAL是局部变量声明标识符;CODEMOV Rct.left,1MOV Rct.top,2MOV Rct.right,3MOV Rct.bottom,42006年3月27日南京大学计算机系 俞建新第22讲 第15页结构定义?结构成员只是一个内存操作数,两个内存操作数之间不能使用MOV指令进行赋值,必须通过中间寄存器或者基于堆栈操作实现两个成员变量之间的赋值?结构还可以嵌套使用2006年3月27日南京大学计算机系 俞建新第22讲 第16页分支和循环?条件测试语句操作符意义=等于!=不等于大于=大于等于小于=EBX) | !ZERO?下面语句是不正确的.I

10、F 3=EAX.IF X=Y这是因为80x86指令集中不存在立即数和寄存器/存储器、存储器和存储器之间的比较指令2006年3月27日南京大学计算机系 俞建新第22讲 第18页分支和循环?分支语句.IF conditionifstatements.ELSEIF conditionelseifstatements.ELSEelsestatements.ENDIF2006年3月27日南京大学计算机系 俞建新第22讲 第19页分支和循环?循环语句.REPEATstatements.UNTIL condition.REPEATstatements.UNTILCXZ condition.WHILE con

11、ditionstatements.ENDW.BREAK .IF conditon.CONTINUE .IF condition2006年3月27日南京大学计算机系 俞建新第22讲 第20页循环与优化?优化前的代码MOV EDX,0Label:;编写汇编代码INC EDXCMP EDX,1000000JE lblOutJMP LabellblOut:优化后的代码MOV EDX,1000000Label:;编写汇编代码DEC EDXJNZ Label2006年3月27日南京大学计算机系 俞建新第22讲 第21页循环与优化?减少循环次数是对代码进行优化的一条捷径,为了减少循环次数,就必须在一次循环中

12、安排更多的指令或者任务?一般的,系统支持的内置批处理指令往往没有手工安排的指令运行快,比如LOOP、LOOPE、LOOPZ、LOOPNZ、LOOPNE指令就没有CMP/JMP指令快2006年3月27日南京大学计算机系 俞建新第22讲 第22页宏的使用和定义?宏可以大大简化汇编代码的书写,提供代码的重用率,宏代码只能减小源代码的长度,但不能减小编译后二进制代码的长度?宏定义语法Name MACRO parameter :tag ,parameter :tag .LOCAL varliststatementsEXITM textitem 如果在宏定义中需要标号,则必须使用LOCAL进行声明2006

13、年3月27日南京大学计算机系 俞建新第22讲 第23页MASM32 宏的使用?重复汇编?重复汇编的宏定义包括以下几个宏:FOR、FORC、FOTO、REPEAT和WHILEFOR parameter :REQ |:=default ,statementsENDMFORC parameter,statementsENDMGOTO macrolabelREPEAT expressionstatementsENDMWHILE expressionstatementsENDMFOR宏定义将对参数列表中的每一个参数执行一次语句,当前的参数parameter逐项被参数列表中每一个参数迭代而FORC伪指令的

14、功能是将字符串中的逐个字符按照从左到右的顺序逐个替换形式参数REPEAT和WHILE用于按照设定的重复次数进行重复汇编2006年3月27日南京大学计算机系 俞建新第22讲 第24页MASM32 宏的使用?条件汇编?条件汇编和高级语言中的条件编译类似,它能够根据某种条件决定是否汇编某段语句序列IF cond expressionifstatementsELSEIF cond expressionelseifstatements-ELSEelsestatementsENDIF2006年3月27日南京大学计算机系 俞建新第22讲 第25页Invoke的使用?语法Invoke expression ,

15、arguments其中expression是过程的名称,arguments是参数列表,这些参数即可以是寄存器,也可以是表达式或者ADDR LABEL1、常规调用PUSH OFFSET par4PUSH par3PUSH OFFSET par2PUSH par1CALL FunctionNameMOV retval,EAX2、使用invoke调用Invoke FunctionName,par1,ADDR par2,par3,ADDR par4MOV retval,EAX第三章创建窗口应用程序2006年3月27日南京大学计算机系 俞建新第22讲 第27页WinMain函数的创建?WinMain过程

16、的实现.data?hInstance HINSTANCE ?CommandLine LPSTR ?.codestart:invoke GetModuleHandle,NULLMOV hInstance,EAXinvoke GetCommandLineMOV CommandLine,EAXInvokeWinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULTinvoke ExitProcess,EAX2006年3月27日南京大学计算机系 俞建新第22讲 第28页WinMain函数的创建?汇编语言中WinMain的声明?WinMain proc hInsta

17、nce:HINSTANCE,hPrevInstance:HINSTANCE,lpCmdLine:LPSTR,nCmdShow:DWORD2006年3月27日南京大学计算机系 俞建新第22讲 第29页WinMain函数的创建?hInstance是一个标识当前应用程序的实例句柄,可以通过使用NULL参数调用GetModuleHandle函数获得,如上面例中所示?hPrevInstance参数标识当前应用程序前一个实例的句柄,一般取NULL值?lpCmdLine是用于指向命令行参数的字符串指针,可以通过调用GetCommandLine函数获得?nCmdShow用于指定窗口显示方式,这些方式包括SW_

18、SHOW、SW_HIDE、SW_SHOWMAXIMIZED、SW_SHOWMINIMIZED2006年3月27日南京大学计算机系 俞建新第22讲 第30页WinMain函数的创建?WinMain函数返回值是一个整型值,包含在EAX寄存器中,可以利用这个返回值调用ExitProcess函数退出进程?WinMain函数的实现中,首先要定义一个窗口类,并对其进行注册,注册需调用RegisterClassEx函数,函数需要一个WNDCLASSEX结构类型的地址指针参数,调用这个函数前需得对这个结构初始化2006年3月27日南京大学计算机系 俞建新第22讲 第31页WinMain函数的创建?WNDCLA

19、SSEX结构定义WNDCLASSEX STRUCTcbSizeDWORD?styleDWORD?lpfnWndProcDWORD?cbClsExtraDWORD?cbWndExtraDWORD?hInstanceWORD?hIconDWORD?hCursorDWORD?hbrBackgroundDWORD?lpszMenuNameDWORD?lpszClassNameDWORD?hIconSmDWORD?WNDCLASSEX ENDS2006年3月27日南京大学计算机系 俞建新第22讲 第32页WinMain函数的创建?WNDCLASSEX结构各个成员具体含义?cbSize:指定该结构的大小?

20、style:窗口类的风格?lpfnWndProc:窗口过程地址指针?cbClsExtra:指定分配给窗口类结构之后需要的额外字节数,可以赋0值?cbWndExtra:指定分配给窗口实例之后需要的额外字节数,可以赋0值?hInstance:标识当前应用程序的实例句柄,可以把WinMain的hInstance参数赋给这个成员?hIcon:标识窗口类的图标?hCursor:标识窗口类的光标?hbrBackground:标识类的背景画刷的颜色?lpszMenuName:菜单句柄,可以为NULL,?lpszClassName:窗口类的名称?hIconSm:小图标的句柄2006年3月27日南京大学计算机系

21、 俞建新第22讲 第33页WinMain函数的创建?完成窗口类注册的代码?LOCAL wc:WNDCLASSEX?MOV wc.cbSize,SIZEOF WNDCLASSEX?MOV wc.style,CS_HREDRAW OR CS_VREDRAW?MOV wc.lpfnWndProc,OFFSET WndProc?MOV wc.cbClsExtra,NULL?MOV wc.cbWndExtra,NULL?PUSH hInstance?POP wc.hInstance?MOV wc.hbrBackground,COLOR_WINDOW+1?MOV wc.lpszMenuName,NULL?

22、MOV wc.lpszClassName,OFFSET ClassName?invoke LoadIcon,NULL,IDI_APPLICATION?MOV wc.hIcon,EAX?MOV wc.hIconSm,EAX?invoke LoadCursor,NULL,IDC_ARROW?MOV wc.hCursor,EAX?invoke RegisterClassEx,addr wc2006年3月27日南京大学计算机系 俞建新第22讲 第34页WinMain函数的创建?创建实际窗口?invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,W

23、S_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULLMOV hwnd,EAX2006年3月27日南京大学计算机系 俞建新第22讲 第35页WinMain函数的创建?窗口创建后还需显示和更新?invoke ShowWindow,hwnd,SW_SHOWNORMAL?invoke UpdateWindow,hwnd?ShowWindow和UpdateWindow分别是显示和更新窗口函数2006年3月27日南京大学计算机系 俞建新第22讲 第36页WinMain函

24、数的创建?窗口创建后还需处理消息循环,将消息发送到对应的窗口过程?.WHILE TRUE?invoke GetMessage,ADDR msg,NULL,0,0?.BREAK .IF (!EAX)?invoke TranslateMessage,ADDR msg?invoke DispatchMessage,ADDR msg?.ENDW?MOV EAX,msg.wParam?RET2006年3月27日南京大学计算机系 俞建新第22讲 第37页窗口过程的实现?窗口过程在应用程序处理消息时调用,窗口过程可以拦截消息,用户可对关心的消息加入响应的代码,对不关心的消息可以交给DefWindowProc

25、函数按默认情况处理2006年3月27日南京大学计算机系 俞建新第22讲 第38页窗口过程的实现?WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM?.IF uMsg=WM_DESTROY?invoke PostQuitMessage,NULL?.ELSEIF uMsg=WM_COMMAND?MOV EAX,wParam?.if ax=1000?invoke DestroyWindow,hWnd?.endif?.ELSE?invoke DefWindowProc,hWnd,uMsg,wParam,lParam?RET?.END

26、IF?XOR EAX,EAX?RET?WndProc endp2006年3月27日南京大学计算机系 俞建新第22讲 第39页创建窗口应用程序?一个完整例子?完整窗口程序第四章窗口资源的使用2006年3月27日南京大学计算机系 俞建新第22讲 第41页窗口资源的使用?菜单、字体、对话框等内容是可执行文件的一部份,并以资源的形式存放在文件中?包含在可执行文件中的资源,并不在源代码中定义,而是在以rc为扩展名的脚本文件中进行定义2006年3月27日南京大学计算机系 俞建新第22讲 第42页窗口资源的使用?下图是工作夹中一个资源文件及此资源文件中的内容2006年3月27日南京大学计算机系 俞建新第22

27、讲 第43页图标?图标在资源文件中的定义?ICONID ICON EABLE PURE LOADONCALL DISCARDABLE “图标文件名”?ICONID为图标标识,通过它来引用图标?加载默认的应用程序图标?invoke LoadIcon,NULL,IDI_APPLICATION?MOV wc.hIcon,EAX?MOV wc.hIconSm,EAX?加载应用程序中标识为500的图标?invoke LoadIcon,hInst,500?MOV wc.hIcon,EAX2006年3月27日南京大学计算机系 俞建新第22讲 第44页菜单?菜单是用户同程序交互的重要手段,下面是一段包含菜单的

28、资源文件?FirstMenu MENU?BEGIN?POPUP &File, , , 0?BEGIN?MENUITEM &Exit, 1000?END?POPUP &Help, , , 0?BEGIN?MENUITEM &About, 1900?END?END2006年3月27日南京大学计算机系 俞建新第22讲 第45页菜单?POPUP标识的是主菜单项,MENUITEM标识的是子菜单项?在窗口类定义和注册时,把菜单资源名称赋给窗口类的lpszMenuName成员,即可显示菜单?MenuNamedb “FirstMenu”,0?.?movwc.lpszMenuName,OFFSET MenuNa

29、me2006年3月27日南京大学计算机系 俞建新第22讲 第46页菜单?若菜单标识为数字,亦可如下引用?invoke CreateWindowEx,WS_EX_LEFT,ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,hMenu, hInst,NULL?MOV hwnd,EAX?invoke LoadMenu,hInst,600?mov hMenu,EAX?invoke SetMenu,hwnd,EAX2006年3月27日南京

30、大学计算机系 俞建新第22讲 第47页菜单的消息处理?当用户选择一个菜单项时,Windows会向菜单所属窗口发送WM_COMMAND消息,通常在主窗口的窗口过程处理函数中处理?WM_COMMAND两个参数的定义?wParam的高16位:通知码?wParam的低16位:命令ID?lparam: 发送WM_COMMAND消息的子窗口句柄?菜单实例?菜单例子2006年3月27日南京大学计算机系 俞建新第22讲 第48页加速键?加速键是一个按键或几个按键的组合,往往和菜单联系在一起,下面是一个资源文件?SHOWDIB2 ACCELERATORS DISCARDABLE?BEGIN?“c”,100,VI

31、RTKEY,CONTROL,NOINVERT?“x”,101,VIRTKEY,CONTROL,NOINVERT?“z”,102,VIRTKEY,CONTROL,NOINVERT?END2006年3月27日南京大学计算机系 俞建新第22讲 第49页加速键?装入加速键表?szAppName db“ShowDib2”,0?hAccelDD?InvokeLoadAccelerators,hInst,ADDR szAppName?Mov hAccel,EAX?在消息循环中对加速键消息进行必要转换?.WHILE TRUE?invoke GetMessage,ADDR msg,NULL,0,0?.BREAK

32、 .IF (!EAX)?invoke TranlateAccelerator,hwnd,hAccel,ADDR msg?.IF !EAX?invoke TranslateMessage,ADDR msg?invoke DispatchMessage,ADDR msg?.ENDW2006年3月27日南京大学计算机系 俞建新第22讲 第50页光标?光标在资源文件中的定义?CURSORID CURSOR DISCARDABLE“光标文件名”?加载默认的应用程序光标?invoke LoadCursor,NULL,IDC_CROSS?MOV wc.hCursor,EAX?加载应用程序中标识为500的光标

33、?invoke LoadCursor,hInst,500?MOV wc.hCursor,EAX?几个有关光标的函数?GetCursor 用于获得当前光标的句柄?SetCursor 用于设置新的光标?ShowCursor 用于显示和隐藏光标?GetCursorPos 用于获取光标当前位置?SetCursorPos 用于设置光标的新位置2006年3月27日南京大学计算机系 俞建新第22讲 第51页位图?位图在资源文件中的定义?100 BITMAP MOV EABLE PURE LOADONCALL DISCARDABLE “BITMAP.BMP”?加载位图资源?LOCAL hBmp:DWORD?i

34、nvoke LoadBitmap,hInstance,100?mov hBmp,EAX?退出程序时需释放位图句柄?invoke DeleteObject,hBmp2006年3月27日南京大学计算机系 俞建新第22讲 第52页对话框?对话框在资源文件中模板的定义对话框在资源文件中模板的定义?对话框ID DIALOG DISCARDABLE X坐标,Y坐标,宽度,高度?可选属性?BEGIN?子窗口控件?END?资源文件中对话框例子资源文件中对话框例子?MyDialog DIALOG DISCARDABLE 10,10,205,122?STYLE DS_MODALFRAME|0x004|DS_CEN

35、TER|WS_CAPTION|WS_SYSMENU|WS_VISIBLE|WS_POPUP?CAPTION Dialog?MENU MyMenu?BEGIN?EDITTEXT 3000,67,8,71,14,ES_AUTOHSCROLL|ES_LEFT?PUSHBUTTON Clear,1001,105,98,35,16?CTEXT Equals,50,13,81,43,9,SS_LEFT?END2006年3月27日南京大学计算机系 俞建新第22讲 第53页对话框?对话框的创建?对话框分为两类,模式对话框和非模式对话框,模式对话框在运行时不能切换到同一程序其他窗口,而非模式对话框可以切换?创建

36、一个非模式对话框用CreatDialogParam,创建一个模式对话框用DialogBoxParam?模式对话框创建后调用EndDialog函数结束,非模式对话框只有调用ShowWindow函数才能显示,只能使用DestroyWindow函数来结束2006年3月27日南京大学计算机系 俞建新第22讲 第54页子窗口控件?子窗口控件是一些Windows预定义类,是一些以对话框为父窗口的子窗口,在资源文件中有如下定义语法?CONTROL text ,ID ,class ,style ,x ,y ,width ,height?或?ControlName text ,ID ,x ,y ,width ,

37、height2006年3月27日南京大学计算机系 俞建新第22讲 第55页模式对话框和非模式对话框?例一?模式对话框?例二?非模式对话框第五章动态链接库2006年3月27日南京大学计算机系 俞建新第22讲 第57页简介?动态链接库是一种多个函数的包装,即便同一个程序同时运行多个实例,Windows也不会加载多个DLL的副本到内存?优点?易于扩展?使用方便,利用多语言开发?易于管理?节省内存?资源共享?本地化移植2006年3月27日南京大学计算机系 俞建新第22讲 第58页动态链接库入口点?动态链接库的入口点是一个函数,其名字没有规定,只需和程序中END关键字后面所跟参数一样就可以。入口函数不是

38、用来提供给外部的应用程序调用的,仅被系统调用,为动态链接库做一些初始化和清理工作?入口函数在以下四种情况被调用?被加载时:DLL_PROCESS_ATTACH?被卸载时:DLL_PROCESS_DETACH?使用该动态链接库进程创建新线程时:DLL_THREAD_ATTACH?销毁一个线程时:DLL_THREAD_DETACH2006年3月27日南京大学计算机系 俞建新第22讲 第59页动态链接库入口点?入口函数有三个参数,第一个是该动态链接库的实例句柄,第二个参数指明入口函数是在上面四种情况的那种下被调用的,最后一个参数是系统保留的2006年3月27日南京大学计算机系 俞建新第22讲 第60

39、页动态链接库输出函数?输出函数和编写子程序没有区别,下面一个例子输出函数和编写子程序没有区别,下面一个例子?LibMain proc hInstDLL:DWORD,reason:DWORD,unused:DWORD?.?LibMain Endp?TestProc proc?jmp F?MbTitle db Test function,0?MbMsg db This is tstdll.dll here,0?:?invoke MessageBox,NULL,addr MbMsg,addr MbTitle,MB_OK?ret?TestProc endp2006年3月27日南京大学计算机系 俞建新第

40、22讲 第61页动态链接库输出函数?为了让其他应用程序使用这个动态链接库,需编写一个模块定义文件tstdll.def,内容如下:?LIBRARYtstdll?EXPORTTestProc?编译可采用如下命令行?masm32binml/c /coff tstdll.asm?masm32binlink /SUBSYSTEM:WINDOWS /DLL /DEF:tstdll.def tstdll.obj2006年3月27日南京大学计算机系 俞建新第22讲 第62页动态链接库输出函数?也可编写一个makefile文件,用nmake.exe编译链接?NAME=tstdll?$(NAME).dll: $(

41、NAME).obj?link /SECTION:.bss,S /DLL /DEF:$(NAME).def /SUBSYSTEM:WINDOWS /LIBPATH:k:masm32lib $(NAME).obj?$(NAME).obj: $(NAME).asm?ml /c /coff /Cp $(NAME).asm2006年3月27日南京大学计算机系 俞建新第22讲 第63页动态链接库输出函数?编译动态链接库时工作夹内容2006年3月27日南京大学计算机系 俞建新第22讲 第64页动态链接库输出函数?例子?动态链接库2006年3月27日南京大学计算机系 俞建新第22讲 第65页调用动态链接库?可

42、执行文件以两种方式加载DLL:隐式链接和显示链接?在隐式链接下,应用程序用include和includelib把动态链接库对应的头文件和.lib导入库文件包括进来,这样在程序中就可直接使用导出函数,如下?include tdll.inc?includelib tdll.lib?invoke TestProc2006年3月27日南京大学计算机系 俞建新第22讲 第66页调用动态链接库?显示链接不需要动态链接库对应的头文件和导入库文件,直接在程序中用程序语句来装入、定位和卸载动态链接库?LoadLibrary:装入动态链接库?GetProcAddress:定位动态链接库?FreeLibrary:卸

43、载动态链接库?例子?调用动态链接库2006年3月27日南京大学计算机系 俞建新第22讲 第67页资源动态链接库的创建和使用?动态链接库和可执行应用程序一样也可嵌入资源?创建如下的DLL文件框架?.386?.model flat,stdcall?Option casemap:none?.code?LibMain proc hInstDLL:DWORD ,reason:DWORD,unused:DWORD?MOV EAX,1?RET?LibMain Endp?END LibMain2006年3月27日南京大学计算机系 俞建新第22讲 第68页资源动态链接库的创建和使用?创建资源文件,可添加任何资源

44、?1000WAVE“Hello.WAVE”?创建编译配置文件?NAME=Rdll?$(NAME).dll: $(NAME).obj $(NAME).res?link /SECTION:.bss,S /DLL /DEF:$(NAME).def /SUBSYSTEM:WINDOWS /LIBPATH:k:masm32lib $(NAME).obj$(NAME).res?$(NAME).res: $(NAME).rc?rc $(NAME).rc?$(NAME).obj: $(NAME).asm?ml /c /coff /Cp $(NAME).asm?运行nmake.exe生成动态链接库2006年3月

45、27日南京大学计算机系 俞建新第22讲 第69页资源动态链接库的创建和使用?动态链接库中资源使用和应用程序中一样,只是调用资源的函数的实例句柄不再是WinMain的入口参数hInst,而需要调用LoadLibrary函数加载动态链接库,通过返回模块句柄作为入口参数第六章系统编程2006年3月27日南京大学计算机系 俞建新第22讲 第71页内存管理和文件操作?分配和使用内存的步骤?调用GlobalAlloc分配一块内存,返回一个标识所请求的内存块的句柄?调用GlobalLock”锁住”内存块,需要一个标识内存块句柄,返回一个指向该内存的指针?用户可用这指针读写内存?使用GlobalUnlock函

46、数“解锁”,使指向该内存指针无效?调用GlobalFree释放内存2006年3月27日南京大学计算机系 俞建新第22讲 第72页内存管理和文件操作?Win32下文件操作?调用CreateFile函数打开或者创建新文件?调用SetFilePointer函数把文件指针移动到需要的位置?调用ReadFile或者WriteFile函数执行读写操作?调用CloseHandle函数关闭文件2006年3月27日南京大学计算机系 俞建新第22讲 第73页内存管理和文件操作?例子?文件读写的实现2006年3月27日南京大学计算机系 俞建新第22讲 第74页内存管理和文件操作?CreateFile函数原型Crea

47、teFile proto lpFileName:DWORD,dwDesiredAccess:DWORD,dwShareMode:DWORD,lpSecurityAttributes:DWORD,dwCreationDistribution:DWORD, dwFlagsAndAttributes:DWORD, hTemplateFile:DWORD ?第二个参数指定对文件的操作:GENERIC_READ 以读方式打开文件GENERIC_WRITE 以写方式打开文件?第三个参数指定文件打开后允许其他进程对文件执行的操作的共享模式0 不与其它进程共享FILE_SHARE_READ 允许其他进程读正被

48、打开的文件数据FILE_SHARE_WRITE允许其他进程向正被打开的文件写数据2006年3月27日南京大学计算机系 俞建新第22讲 第75页内存管理和文件操作?第四个参数为安全属性,标识返回的文件句柄能否被子进程继承,如果为NULL,表示不能继承?第五个参数用于指定当lpFilename标识的文件存在或不存在时指定的操作?第六个参数指定文件属性2006年3月27日南京大学计算机系 俞建新第22讲 第76页内存映像文件?内存映像文件的使用步骤?调用CreateFile函数打开要映像的文件?利用(1)返回的文件句柄作为参数调用CreateFileMapping,创建一个映像对象?调用MapVie

49、wOfFile函数映像一个选定的文件区域或整个文件到内存,返回指向映像区域首字节的指针?利用指针对文件进行读写?利用UnmapViewOfFile函数取消文件映射?调用映像文件为参数调用CloseHandle函数关闭映像文件?调用CreatFile函数返回的句柄为参数调用CloseHandle函数关闭打开的文件2006年3月27日南京大学计算机系 俞建新第22讲 第77页内存映像文件?例子?内存映像文件2006年3月27日南京大学计算机系 俞建新第22讲 第78页内存映像文件?CreateFileMapping proto hFile:DWORD,lpFileMappingAttributes

50、:DWORD,flProtect:DWORD,dwMaximumSizeHigh:DWORD,dwMaximumSizeLow:DWORD,lpName:DWORD ?该函数并没有必要把整个文件映射到内存中去,可以用该函数来只映射文件的一部分。在参数dwMaximumSizeHigh和dwMaximumSizeLow中指定内存映射文件的大小,如果指定的值大于实际的文件,则实际的文件将增长到指定的大小,如果想要映射的内存大小正好和文件的实际大小相等,则把两个参数中都设成为0。您可以设定lpFileMappingAttributes为NULL,让WINDOWS赋予该内存映射文件于缺省的安全属性。2

51、006年3月27日南京大学计算机系 俞建新第22讲 第79页内存映像文件?MapVieOfFile函数原型MapViewOfFile proto hFileMappingObject:DWORD,dwDesiredAccess:DWORD,dwFileOffsetHigh:DWORD,dwFileOffsetLow:DWORD,dwNumberOfBytesToMap:DWORD ?第二个参数指定对文件的操作?第三和四个参数指定要映射文件的起始偏移量,可以给0值,即从头开始?第五个参数指定要映射的字节数,对整个文件可取0值2006年3月27日南京大学计算机系 俞建新第22讲 第80页进程?进程

52、是执行的应用程序,进程最少有执行模块、私有地址空间和一个主线程组成。每个进程至少拥有一个线程,线程实际是一个执行队列?Windwos接受命令创建进程是,为进程创建了私有内存地址空间让后把可执行文件映射到这个空间,让后为这个进程创建主线程2006年3月27日南京大学计算机系 俞建新第22讲 第81页进程?用户调用CreateProcess函数创建新进程,CreateProcess调用立即返回,用户可调用GetExitCodeProcess函数检查进程是否活动?强制一个进程终止可调用TerminateProcess函数?TerminateProcess proto hProcess:DWORD ,

53、uExitCode:DWORD2006年3月27日南京大学计算机系 俞建新第22讲 第82页进程?CreateProcess的原型如下:CreateProcess proto lpApplicationName:DWORD,lpCommandLine:DWORD,lpProcessAttributes:DWORD,lpThreadAttributes:DWORD,bInheritHandles:DWORD,dwCreationFlags:DWORD,lpEnvironment:DWORD,lpCurrentDirectory:DWORD,lpStartupInfo:DWORD,lpProces

54、sInformation:DWORD ?lpApplicationName - 可执行文件的名称(含或不含路径)。如果该参数为NULL,那必须在参数lpCommandLine中传递文件名称。?lpCommandLine - 传递给欲执行的文件的命令行参数。如果lpApplicationName为NULL,那必须在该参数中指定,譬如:notepad.exe readme.txt 。2006年3月27日南京大学计算机系 俞建新第22讲 第83页进程?lpProcessAttributes 和 lpthreadAttributes - 指定进程和主线程的安全属性。您可以把它们都设成为NULL,这样就

55、设置了缺省的安全属性。?bInheritHandles - 标志位。用来设置新进程是否继承创建进程所有的打开句柄。?dwCreationFlags - 有几个标志可以在此处设置以决定欲创建进程的行为,譬如:您可能想创建进程后并不想让它立刻运行,这样在它真正运行前可以作一些检查和修改工作。您还可以在此处设置新进程中的所有线程的优先级,通常我们把它设置为NORMAL_PRIORITY_CLASS。?lpEnvironment - 指向环境块的指针,一般地环境块包含几个环境字符串。如果该参数为NULL,那么新进程继承创建进程的环境块。2006年3月27日南京大学计算机系 俞建新第22讲 第84页进程

56、?lpCurrentDirectory - 指向当前目录以及为子进程设置的“当前目录”的路径。如果为NULL, 则继承创建进程的“当前目录”路径。?lpStartupInfo - 指向新进程的启动结构体STARTUPINFO的指针。STARTUPINFO告诉WINDOWS如何显示新进程的外观。该参数有许多的成员变量,如果您不想新进程有什么的特别之处,可以调用GetStartupInfo函数来用创建进程的启动参数来填充STARTUPINFO结构体变量。?lpProcessInformation - 指向结构体PROCESS_INFORMATION的指针2006年3月27日南京大学计算机系 俞建新

57、第22讲 第85页进程?例子?进程2006年3月27日南京大学计算机系 俞建新第22讲 第86页多线程开发?多线程使一个应用程序能同时运行多个任务,线程运行在同一进程中,能存取进程中的任何资源,创建线程可以调用函数CreateThread?例子?线程2006年3月27日南京大学计算机系 俞建新第22讲 第87页多线程开发?CreateThread proto lpThreadAttributes:DWORD,dwStackSize:DWORD,lpStartAddress:DWORD,lpParameter:DWORD,dwCreationFlags:DWORD,lpThreadId:DWOR

58、D ?lpThreadAttributes -如果您想要线程有缺省的安全属性,可以置该值为NULL。?dwStackSize - 指定线程的堆栈大小。如果为0,那线程的大小和进程相同。?lpStartAddress- 线程函数的起始地址。注意该函数仅接收一个32位的参数和返回一个32位的值。(该参数可以是一个指针,而且进程的线程可以直接存取进程定义全局变量,所以您大可不必担心不能如何把大量的参数传递给线程)。2006年3月27日南京大学计算机系 俞建新第22讲 第88页多线程开发?lpParameter - 传递给线程的上下文。?dwCreationFlags -如果是0的话则表示创线程建后立即启动,相反的是标志位CREATE_SUSPENDED,这样您需要稍后显示地让该线程运行。?lpThreadId - 内核给新生成的线程分配的线程ID。2006年3月27日南京大学计算机系 俞建新第22讲 第89页第22讲结束谢谢大家的使用!欢迎大家提出宝贵意见和建议!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号