iczelion tut13[5]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 jimgreen 的 blog

                                                0,\
                                                null,open_existing,file_attribute_archive,\
                                                null

当用户选择打开文件时,我们调用createfile来打开。注意我们指定generic_read(一般的读)来表示我们打开的文件只能够读出,把dwsharemode设成0,表示我们不想其他进程在我们操作文件时来存取该文件。

                    invoke createfilemapping,hfileread,null,page_readonly,0,0,null

我们调用createfilemapping来在打开的文件的基础上生成内存映射文件。createfilemapping的语法如下:

createfilemapping proto hfile:dword,\
                                         lpfilemappingattributes:dword,\
                                         flprotect:dword,\
                                         dwmaximumsizehigh:dword,\
                                         dwmaximumsizelow:dword,\
                                         lpname:dword

您应当知道该函数并没有必要把整个文件映射到内存中去,您可以用该函数来只映射文件的一部分。您可以在参数dwmaximumsizehigh和dwmaximumsizelow中指定内存映射文件的大小,如果您指定的值大于实际的文件,则实际的文件将增长到指定的大小,如果想要映射的内存大小正好和文件的实际大小相等,则把两个参数中都设成为0。您可以设定lpfilemappingattributes为null,让windows赋予该内存映射文件于缺省的安全属性。
flprotect定义了内存映射文件的保护属性,我们指定它为page_readonly来规定该内存映射文件只能够读。注意该属性不能和createfile中指定的属性相矛盾,否则就不能生成内存映射文件。
lpname指定内存映射文件的名称,如果您想要该内存映射文件同时可以供其它的进程使用,就必须给它取个名称。不过在我们的例子中,只有我们的进程使用该内存映射文件故我们忽略该参数。

                    mov     eax,offset buffer
                    movzx  edx,ofn.nfileoffset
                    add      eax,edx
                    invoke setwindowtext,hwnd,eax

如果函数createfilemapping调用成功,我们把窗口的标题条换成被打开文件的名称。保存在缓冲区中的文件名是带有路径的全文件名,所以为了只显示文件名我们需要利用openfilename结构体中的成员nfileoffset的值来找到文件名的起始地址。

                    invoke enablemenuitem,hmenu,idm_open,mf_grayed
                    invoke enablemenuitem,hmenu,idm_save,mf_enabled

为了避免用户一次性打开多个文件,我们让“打开文件”菜单项呈灰色显示,使得打开文件的菜单项失效。函数enablemenuitem可以用来改变菜单项的属性。 之后用户可能保存文件或者直接关闭应用程序。如果用户选择关闭应用程序,则事先必须关闭内存映射文件和打开的文件, 代码如下:

    .elseif umsg==wm_destroy
        .if hmapfile!=0
            call closemapfile
        .endif
        invoke postquitmessage,null

在上面的代码段中,当windows的消息处理过程接收到wm_destroy消息后,它首先检测hmapfile值是否为0。如果不为0则表示相关的文件未关闭,这样就需要调用closemapfile来关闭它们。

closemapfile proc

本文关键:iczelion asm
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top