在DOS下有這樣的命令type 文件名,使用這個命令可查看文件的內容,要處理的文件名直接跟在程序名後,這種用法很普遍,在Windows下仍然如此,只是可能你沒感覺到罷啦。雙擊一個文本文件,系統就用記事本打開這文件,實際上就是將你所雙擊的文件名作為記事本的參數來處理的。
所以作為windows下的這類程序,可先從命令行獲取要處理的文件名,若命令行上取不到,再顯示“打開文件”對話框讓用戶選擇一個文件也不晚!
下面的例子將從命令行提取要處理的文件名,假設文件名是位於程序名後的第一個參數。
----------------------------------------------------------
;文件名:15.asm
;取命令行參數並顯示,用於分析命令行參數可能出現的情況
.386
.model flat,stdcall
Option CaseMap:none
include windows.inc
include kernel32.inc
include user32.inc
include masm32.inc
includelib kernel32.lib
includelib user32.lib
includelib masm32.lib
.data
szCaption db "GetCommandLine",0
.data?
FileName db 256 dup(?)
.code
GetFileNameFromCommandLine PROTO :LPSTR ;用來存放處理後的文件名
start:
invoke GetFileNameFromCommandLine,addr FileName
.if eax!=NULL
invoke MessageBox,NULL,eax,addr szCaption,MB_OK
.endif
invoke ExitProcess,NULL
;返回時若eax=NULL則表示無法從命令行提取被處理的文件
;否則eax指向文件名地址
GetFileNameFromCommandLine proc uses esi edi ,lpString:LPSTR
mov edi,lpString
invoke GetCommandLine ;取命令行參數
mov esi,eax
xor eax,eax
cld
;跳過程序名項,該項可能處在雙引號中間
G1:
lodsb
cmp al,'"' ;程序名以雙引號開始嗎?
jnz G3
G2:
lodsb
cmp al,'"' ;引號表示程序名項的結束
jnz G2
G3:
lodsb ;程序名項和後面的參數間至少有一空白
cmp al,' '
jnz G3
;跳過空白和制表,指向文件名
G4:
lodsb
cmp al,0
jz G7
cmp al,' '
jz G4
cmp al,9
jz G4
cmp al,'"' ;文件名也是以雙引號開始嗎?
jnz G5
stosb
G4p:
lodsb
stosb
cmp al,'"' ;找到引號就是文件名的結束
jnz G4p
jmp G6
;跳到文件的末尾
G5:
stosb ;將文件名傳輸到緩沖區
lodsb
cmp al,0
jz G6
cmp al,' '
jz G6
cmp al,9
jnz G5
G6:
xor al,al ;緩沖區中文件名結束
stosb
mov eax,lpString ;eax指向緩沖區首地址
G7:
ret
GetFileNameFromCommandLine endp
end start
-----------------------------------------------------------------
執行示例:
D:\KZ_Z>GetFileName "\My documents\pop.exe"
D:\KZ_Z>GetFileName Cala.exe