當命令列無參數時,透過通用對話框讓使用者選擇檔案是標準作法。Windows 提供 GetOpenFileName API,配合 OPENFILENAME 結構即可輕鬆實現。本文提供完整 MASM 範例,包含過濾器設定、標題自訂、長檔名支援等細節。
ofn OPENFILENAME <0>
szFileName db 256 dup(0)
szFilterString db '可執行檔(*.exe)',0,'*.exe',0,0
szMyTitle db '請選擇要開啟的檔案', 0
szMessageTitle db '你選擇的檔案是',0
過濾器字串格式:描述\0模式\0\0,雙重空字元結尾。
GetFileNameFromDialog proc
mov ofn.lStructSize, sizeof ofn
mov ofn.lpstrFilter, offset szFilterString
mov ofn.lpstrFile, offset szFileName
mov ofn.nMaxFile, 256
mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_LONGNAMES
mov ofn.lpstrTitle, offset szMyTitle
invoke GetOpenFileName, addr ofn
ret
GetFileNameFromDialog endp
Start:
call GetFileNameFromDialog
.if eax != 0
invoke MessageBoxA, NULL, addr szFileName, addr szMessageTitle, NULL
.endif
invoke ExitProcess, NULL
end Start
| 旗標 | 用途 |
|---|---|
| OFN_FILEMUSTEXIST | 檔案必須存在,否則報錯 |
| OFN_HIDEREADONLY | 隱藏「唯讀」核取方塊 |
| OFN_LONGNAMES | 支援長檔名(Win95+必要) |
| OFN_EXPLORER | 使用新型樣式對話框(Vista+預設) |
OFN_ALLOWMULTISELECT,緩衝區需放大(如 4096 bytes),回傳格式為「目錄\0檔1\0檔2\0\0」。lpstrInitialDir。lpstrDefExt。ml /c /coff /Cp openfile.asm
link /subsystem:windows openfile.obj
需連結 comdlg32.lib。