📄 tut11.html
字号:
.endif</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
.else</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
invoke DestroyWindow, hWnd</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
.endif</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
.ELSE</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
invoke DefWindowProc,hWnd,uMsg,wParam,lParam</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
ret</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
.ENDIF</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
xor eax,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
ret</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>WndProc
endp</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1> end
start</font></font></font></b>
<br>
<hr WIDTH="100%">
<h3>
<font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>Analysis:</font></font></font></h3>
<b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
mov ofn.lStructSize,SIZEOF ofn</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
push hWnd</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
pop ofn.hwndOwner</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
push hInstance</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
pop ofn.hInstance</font></font></font></b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>We
fill in the routine members of ofn structures.</font></font></font><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
mov ofn.lpstrFilter, OFFSET FilterString</font></font></font></b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>This
FilterString is the filename filter that we specify as follows:</font></font></font>
<blockquote><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>FilterString
db "All Files",0,"*.*",0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
db "Text Files",0,"*.txt",0,0</font></font></font></b></blockquote>
<font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>Note that
All four strings are zero terminated. The first string is the description
of the following string. The actual pattern is the even number string,
in this case, "*.*" and "*.txt". Actually we can specify any pattern we
want here. We MUST put an extra zero after the last pattern string to denote
the end of the filter string. Don't forget this else your dialog box will
behave strangely.</font></font></font><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
mov ofn.lpstrFile, OFFSET buffer</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
mov ofn.nMaxFile,MAXSIZE</font></font></font></b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>We
specify where the dialog box will put the filename that the user selects.
Note that we must specify its size in nMaxFile member. We can later extract
the filename from this buffer.</font></font></font><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
mov ofn.Flags, OFN_FILEMUSTEXIST or \</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
OFN_PATHMUSTEXIST or OFN_LONGNAMES or\</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
OFN_EXPLORER or OFN_HIDEREADONLY</font></font></font></b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>Flags
specifies the characteristics of the dialog box.</font></font></font>
<br><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>OFN_FILEMUSTEXIST
and OFN_PATHMUSTEXIST flags demand that the filename and path that the
user types in the filename edit control MUST exist.</font></font></font>
<br><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>OFN_LONGNAMES
flag tells the dialog box to show long filenames.</font></font></font>
<br><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>OFN_EXPLORER
flag specifies that the appearance of the dialog box must be explorer-like.</font></font></font>
<br><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>OFN_HIDEREADONLY
flag hides the read-only checkbox on the dialog box.</font></font></font>
<br><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>There
are many more flags that you can use. Consult your Win32 API reference.</font></font></font><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
mov ofn.lpstrTitle, OFFSET OurTitle</font></font></font></b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>Specify
the title of the dialog box.</font></font></font><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
invoke GetOpenFileName, ADDR ofn</font></font></font></b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>Call
the GetOpenFileName function. Passing the pointer to the ofn structure
as its parameter.</font></font></font>
<br><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>At
this time, the open file dialog box is displayed on the screen. The function
will not return until the user selects a file to open or presses the cancel
button or closes the dialog box.</font></font></font>
<br><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>It
'll return the value TRUE in eax if the user selects a file to open. It
returns FALSE otherwise.</font></font></font><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
.if eax==TRUE</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
invoke lstrcat,offset OutputString,OFFSET FullPathName</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
invoke lstrcat,offset OutputString,ofn.lpstrFile</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
invoke lstrcat,offset OutputString,offset CrLf</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
invoke lstrcat,offset OutputString,offset FullName</font></font></font></b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>In
case the user selects a file to open, we prepare an output string to be
displayed in a message box. We allocate a block of memory in OutputString
variable and then we use an API function, lstrcat, to concatenate the strings
together. In order to put the strings into several lines, we must separate
each line with a carriage return-line feed pair.</font></font></font><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
mov eax,ofn.lpstrFile</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
push ebx</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
xor ebx,ebx</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
mov bx,ofn.nFileOffset</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
add eax,ebx</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
pop ebx</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
invoke lstrcat,offset OutputString,eax</font></font></font></b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>The
above lines require some explanation. nFileOffset contains the index into
the ofn.lpstrFile. But you cannot add them together directly since nFileOffset
is a WORD-sized variable and lpstrFile is a DWORD-sized one. So I have
to put the value of nFileOffset into the low word of ebx and add it to
the value of lpstrFile.</font></font></font><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
invoke MessageBox,hWnd,OFFSET OutputString,ADDR AppName,MB_OK</font></font></font></b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>We
display the string in a message box.</font></font></font><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>
invoke RtlZerolMemory,offset OutputString,OUTPUTSIZE</font></font></font></b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1></font></font></font>
<p><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>We
must *clear* the OutputString before we can fill in another string. So
we use RtlZeroMemory function to do the job.</font></font></font>
<br>
<hr WIDTH="100%">
<center><b><font face="Arial,Helvetica"><font color="#CCCCCC"><font size=-1>[<a href="http://win32asm.cjb.net">Iczelion's
Win32 Assembly HomePage</a>]</font></font></font></b></center>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -