2012年7月5日星期四

CommandLineToArgvW.asm


;终于完成了,完成了多年的梦想。
;我鄙视c与c++
;我选择了汇编,没有选择java,delphi,.net,我不后悔。
;made by correy
;QQ:112426112
;Email:leguanyuan@126.com
;Homepage:http://correy.webs.com
;不足之处,敬请指导。
;不足之处:路径与文件名和参数不支持汉字。多一个汉字便少显示一个(字符或汉字)。
;解决办法是计算0的个数(是偶数位呀!)或则把0删除。因为繁忙就不写了,有空与机会再写吧!你也可以替我完成呀!
;当然不用WideCharToMultiByte转换成ANSI字符,纯手工制作没有此问题。
;本功能支持空格,参数里面加空格需要用引号。
.386
.model flat,stdcall
option casemap:none
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include shell32.inc
includelib shell32.lib

.data
notice db "请想办法多输入一些参数试试看!",10,13,0
outtitle db "按回车键退出!",13,10,0
entry db 13,10,0

.data?
hstdin dd ?
hstdout dd ?
x dd ?
y dd ?
z dd ?
s dd ?
buffer db 200h dup (?)

.code
start:
invoke GetStdHandle,-10
mov hstdin,eax
invoke GetStdHandle,-11
mov hstdout,eax

invoke WriteFile,hstdout,addr notice,sizeof notice-1,0,0

invoke GetCommandLineW
invoke CommandLineToArgvW,eax,addr x

mov y,eax

again:
mov eax,y

mov eax,[eax]
mov z,eax

;invoke MessageBoxW,0,eax,0,0 ;此时不可以用messagebox与messageBoxA显示.
invoke lstrlenW,z
mov s,eax

;以下转换成ANSI字符.
;当然不转换也可以在控制台下显示,显示的长度是:2s+2.  (shl,eax,1 ; add eax,2)
invoke WideCharToMultiByte,0,0,z,s,addr buffer,sizeof buffer,0,0

invoke WriteFile,hstdout,addr buffer,s,0,0
invoke WriteFile,hstdout,addr entry,2,0,0

invoke RtlZeroMemory,addr buffer,sizeof buffer

add y,4

dec x
cmp x,0
jne again

invoke WriteFile,hstdout,addr outtitle,sizeof outtitle-1,0,0
invoke ReadFile,hstdin,addr buffer,sizeof buffer,addr x,0
ret
end start 
;made at 2010.11.07

没有评论:

发表评论