⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmd_line.asm

📁 一个十六进制编辑器源代码,cool!
💻 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 + -