.elseif ax == IDC_BROWSE
invoke wsprintf,offset szBuffer,offset szFormat,offset szFileName;,@stOF.lpstrFile
invoke MessageBox,hWinMain,addr szBuffer,NULL,MB_OK
invoke RtlZeroMemory,addr @stOF,sizeof @stOF
mov @stOF.lStructSize,sizeof @stOF
push hWinMain
pop @stOF.hwndOwner
mov @stOF.lpstrFilter,offset szFileExt
mov @stOF.lpstrFile,offset szFileName
mov @stOF.nMaxFile,MAX_PATH
mov @stOF.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST
invoke GetOpenFileName,addr @stOF
.if eax
invoke SetDlgItemText,hWnd,IDC_FILE,addr szFileName
.endif
invoke wsprintf,offset szBuffer,offset szFormat,addr @stOF.lpstrFile
invoke MessageBox,hWinMain,addr szBuffer,NULL,MB_OK
代码如上,摘自win32汇编第13章,@stOF是定义为OPENFILENAME结构。程序功能是打开对话框选择文件。其中这一句,无法理解:
mov @stOF.lpstrFile,offset szFileName
szFileName是个全局变量,初始为空,[email protected],[email protected]?
然后
invoke GetOpenFileName,addr @stOF,@stOF结构被填充,[email protected],而不再是szFileName的偏移地址!可是下一句
invoke SetDlgItemText,hWnd,IDC_FILE,addr szFileName又是用szFileName作为参数将文件名显示,
我就觉得奇怪,szFileName如何得到了文件信息,[email protected]?的内存啊?
求解释
------解决方案--------------------
这个成员本来就是个地址,当函数成功返回时,所选择的文件名就是存放到那个地址指向的内存处的;你这里将 szFileName 的地址赋予 @stOF.lpstrFile 那 GetOpenFileName() 返回时,szFileName 处就被这个函数填上了所选择的文件名了。