dwflagsandattributes:dword\,
htemplatefile:dword
dwdesiredaccess 指定想要进行的操作。
- 0 打开文件查询它的属性。
- generic_read 打开文件读
- generic_write 打开文件写.
dwsharemode 指定文件的共享模式。
- 0 不让其他进程共享,即当您打开该文件后,其他进程欲打开该文件时将失败。
- file_share_read 允许其他进程读。
- file_share_write 允许其他进程写。
lpsecurityattributes 该属性在win95下无效。
dwcreationdistribution 指定欲生成的文件在其已存在和未存在时应做的动作。
- create_new 生成一个新文件。如果文件已存在则失败。
- create_always 无论文件是否存在都生成一个新文件。
- open_existing 打开存在的文件。如果文件不存在则失败。
- open_always 打开文件,如果该文件不存在则生成,这和在dwcreationdistribution 中设置 create_new标志位一样。
- truncate_existing打开文件。打开时该文件的长度裁减到零(也即完全不要原来的文件了)。这要求调用进程必须有generic_write的权利,如果指定的文件不存在,该函数返回失败。
dwflagsandattributes 指定文件的属性。
- file_attribute_archive 该文件具有一般的归档文件的属性。用户可以用该标志位来标记文件的删除和备份。
- file_attribute_compressed 文件或目录是压缩的。对于文件来说是压缩其中的所有数据,而对于目录来说新生成的子目录和文件都要压缩。
- file_attribute_normal 该文件没有一般的属性集。该标志位只能单独使用。
- file_attribute_hidden 该文件是隐藏文件,当浏览一般的文件目录时将不显示它。
- file_attribute_readonly 该文件是只读文件。应用程序可以读其中的内容,但不可以写。
- file_attribute_system 该文件是系统文件。
invoke globalalloc,gmem_moveable or gmem_zeroinit,memsize
mov hmemory,eax
invoke globallock,hmemory
mov pmemory,eax
文件打开后,我们将分配一块内存供随后的api 函数readfile 和 writefile使用。我们使用标志gmem_moveable来使得windows总是把内存块移到可靠的内存中去,gmem_zeroinit告诉windows把刚刚分配的内存置为零。如果globalalloc调用成功的话,会在eax中返回内存块的句柄,我们把该句柄传给globallock函数以得到指向内存块的指针。
invoke readfile,hfile,pmemory,memsize-1,addr sizereadwrite,null
invoke sendmessage,hwndedit,wm_settext,null,pmemory
使内存块可用后,我们调用readfile函数从文件中读数据。对于第一次打开的文件,文件的指针放在偏移0处,像本例中我们从偏移0处往前读。readfile的第一个参数是文件句柄,第二个参数是指向内存块的指针,接下来的参数是要读的数据的长度,第四个参数是一个指向dword型的参数的指针,它用来存放实际读的数据的长度。读完了后,我们把这些内容存放到编辑控件中,这要用消息传递来完成,我们把消息wm_settext传给编辑控件,其中的参数lparam中包含指向内存块的指针。到此处,编辑控件就可以在它的客户区显示文件的内容了。
invoke closehandle,hfile
invoke globalunlock,pmemory
invoke globalfree,hmemory
.endif
我们不再需要让文件打开了,因为我们的目的是把修改后的数据保存到另一个文件而不是先前的那一个文件中去。所以我们可以调用closehandle来关闭文件。接下来我们解锁内存块,再释放它。实际上我们可以暂不释放内存块,而在以后的操作中重新利用。我们为了演示的原由,选择了释放它。
invoke setfocus,hwndedit
当打开文件对话框显示在屏幕上时,输入的焦点切换到了该对话框上。所以在该对话框关闭后,我们必须把焦点切换到编辑控件上。 现在打开文件的阶段结束了,用户可以编辑他们打开的文件了。当用户想把修改后的内容保存到磁盘上时,必须选择file/save菜单项,这时会显示一个保存文件对话框。显示保存文件对话框其实和打开打开文件对话框基本一样。您甚至可以认为他们的不同只是函数名称不一样而已。此处可以复用大多数ofn变量先前设置的成员的值。
mov ofn.flags,ofn_longnames or\
ofn_explorer or ofn_hidereadonly
本例中我们将生成一个新文件,所以一定不能有 ofn_filemustexist 和 ofn_pathmustexist标志位。dwcreationdistribution 参数应当有create_new标志位。 接下来的代码和打开问对话框基本一样。最后调用:
invoke sendmessage,hwndedit,wm_gettext,memsize-1,pmemory