首页
社区
课程
招聘
[求助][讨论]老罗书中的一个问题,关于内存映射文件在进程间贡献数据
发表于: 2009-9-8 19:00 3889

[求助][讨论]老罗书中的一个问题,关于内存映射文件在进程间贡献数据

2009-9-8 19:00
3889
书中代码:
                .386
                .model flat, stdcall
                option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN        equ                1000
DLG_MAIN        equ                100
IDC_TXT                equ                101
IDC_INFO        equ                102
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .data?

hInstance        dd        ?
hWinMain        dd        ?
hFileMap        dd        ?
lpMemory        dd        ?

                .const
szErr                db        '无法建立内存共享文件',0
szMMFName        db        'MMF_Share_Example',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_CreateMMF        proc

                invoke        OpenFileMapping,FILE_MAP_READ or FILE_MAP_WRITE,0,addr szMMFName
                .if        ! eax
                        invoke        CreateFileMapping,-1,NULL,PAGE_READWRITE,0,4096,addr szMMFName
                        .if        ! eax
                                jmp        @F
                        .endif
                .endif
                mov        hFileMap,eax
                invoke        MapViewOfFile,eax,FILE_MAP_READ or FILE_MAP_WRITE,0,0,0
                .if        eax
                        mov        lpMemory,eax
                        mov        dword ptr [eax],0
                        ret
                .endif
                invoke        CloseHandle,hFileMap
@@:
                invoke        MessageBox,hWinMain,addr szErr,NULL,MB_OK
                invoke        EndDialog,hWinMain,-1
                ret

_CreateMMF        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_CloseMMF        proc

                invoke        UnmapViewOfFile,lpMemory
                invoke        CloseHandle,hFileMap
                mov        lpMemory,0
                mov        hFileMap,0
                ret

_CloseMMF        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain        proc        uses ebx edi esi hWnd,wMsg,wParam,lParam
                local        @szBuffer[4096]:byte

                mov        eax,wMsg
                .if        eax ==        WM_TIMER
                        invoke        SetDlgItemText,hWnd,IDC_INFO,lpMemory
                .elseif        eax ==        WM_CLOSE
                        invoke        KillTimer,hWnd,1
                        invoke        _CloseMMF
                        invoke        EndDialog,hWinMain,0
;********************************************************************
                .elseif        eax ==        WM_INITDIALOG
                        push        hWnd
                        pop        hWinMain
                        invoke        LoadIcon,hInstance,ICO_MAIN
                        invoke        SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
                        invoke        SendDlgItemMessage,hWnd,IDC_TXT,EM_SETLIMITTEXT,100,0
                        invoke        _CreateMMF
                        invoke        SetTimer,hWnd,1,200,NULL
;********************************************************************
                .elseif        eax ==        WM_COMMAND
                        mov        eax,wParam
                        .if        ax ==        IDC_TXT && lpMemory
                                invoke        GetDlgItemText,hWnd,IDC_TXT,lpMemory,4096
                        .endif
;********************************************************************
                .else
                        mov        eax,FALSE
                        ret
                .endif
                mov        eax,TRUE
                ret

_ProcDlgMain        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
                invoke        GetModuleHandle,NULL
                mov        hInstance,eax
                invoke        DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
                invoke        ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                end        start

红色代码部分的逻辑与操作。
本示例代码也都非常明白,而且在我看来,此句中就算不进行逻辑与操作也不会对程序有什么影响啊。既然是这样,笔者为什么还是加了逻辑与运算?
我毕竟初入此行,所以观念有些不对的地方,还等大牛们告知我,笔者加词句的"用意",不是加了此句后程序要做什么。。。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
问题解决了。。。。。。
2009-9-8 19:23
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
3
ax ==  IDC_TXT 为了判断接到WM_COMMAND消息是由于IDC_TXT控件而不是别的控件。
&& lpMemory 是为了谨慎,确定该地址有效。
2009-9-8 19:27
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
呵呵,多谢朋友。。
2009-9-8 19:29
0
游客
登录 | 注册 方可回帖
返回
//