📄 cmd_line.asm
字号:
;分析参数
GetCmdLine proto :DWORD
MAXPARAMS=255
.data
lpCmdLineBuf dd ?
lpCmdLine dd ?
.code
;------------------------------------------------------------------------
;返回值
;eax为参数的个数
;bOnlyOne设定只接受一个参数
;lpCmdLine[0]为第一个参数,lpCmdLine[1]为第二个参数......
;第一个参数是程序本身的路径名
;bOnlyOne这个参数的主要作用:
;当一个文件名包含了空格的话,如果是直接把它拖到应用程序的图标上
;那么传递过来的参数的左右有双引号,但如果这个文件是通过拖放的方式或右击它选"Edit With xHex"
;则没有左右的双引号
;ps:如果用户拖2个文件图标到应用程序的图标上,就会提示出错 :(
;不过,因为本程序是单文档界面,没有处理多参数的必要
GetCmdLine proc uses esi edi edx ebx edx bOnlyOne
local wParam,lpcmdEnd
call GetCommandLine
mov esi,eax
mov lpcmdEnd,eax
invoke lstrlen,eax
add lpcmdEnd,eax;指向结束
invoke GlobalAlloc,GPTR , eax
mov lpCmdLineBuf,eax
invoke GlobalAlloc,GPTR , 4*MAXPARAMS;最多255个参数
mov lpCmdLine,eax
mov edi,eax
xor ebx,ebx
.while BYTE ptr [esi] && esi<lpcmdEnd && ebx<MAXPARAMS
;如果参数的第一个字符不是双引号,则这个参数由空格表示结束
;否则是双引号结束
.if bOnlyOne && ebx==1
invoke lstrcpy,edi,esi
.if BYTE ptr [eax]=='"'
inc eax
mov lpCmdLine[ebx*4],eax
invoke lstrlen,eax
mov BYTE ptr [edi+eax],0
.else
mov lpCmdLine[ebx*4],eax
.endif
inc ebx
jmp _done_
.endif
.if BYTE ptr [esi]!='"'
mov ah,20h
mov wParam,0
.else
mov ah,'"'
inc esi
mov wParam,1
.endif
mov edx,esi
.while TRUE
lodsb
.break .if al==0 || al==ah
.endw
mov eax,esi
sub eax,edx
invoke lstrcpyn,edi,edx,eax
mov lpCmdLine[ebx*4],eax
inc ebx
invoke lstrlen,eax
add edi,eax
mov BYTE ptr [edi],0
inc edi
add esi,wParam
.endw
_done_:
mov eax,ebx
ret
GetCmdLine endp
;--------------
CmdLineEnd:
invoke GlobalFree, lpCmdLine
invoke GlobalFree, lpCmdLineBuf
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -