主题:[原创]命令行参数在VB中的利用
作者: 阿珊境界
提起命令行,你或许会想到DOS应用程序,例如"format /q C:"表示快速格式化C盘。Win32程序同样也支持命令行。如,打开开始菜单/运行,然后键入“notepad.exe c:\1.txt",它便会启动记事本,并打开C盘下的1.txt文件。同样,注册控件用的regsvr32.exe、Office程序等都接受命令行。下面,我和大家一起,用VB打造一个自己的命令行程序。
创建一个新工程test,我们要让程序运行后可以弹出一个消息框把命令行显示出来。在VB中用VBA来代表应用程序本身(Visual Basic Application),其中的Command属性提供了命令行参数。在正常双击运行EXE时该值为空。打开代码编辑器,写上下面的代码:
Private Sub Form_Load()
Dim strCmd As String
strCmd = VBA.Command
MsgBox strCmd
End Sub
下一步编译程序:打开文件菜单/生成test.exe。假设test目录在D盘根目录下,打开开始菜单/运行,输入:
D:\test\test.exe hello
点确定,程序运行了,弹出一个消息框,显示“hello”。如图:
[img]http://www.asanscape.com/softshare/img/cmdhello.jpg[/img]
这下好了,这个用处可多哪。我们可以在另一个程序loader中用Shell执行“D:\test\test.exe hello"来让test.exe运行并弹出hello。但问题来了。如果“test.exe”在D:\my test\目录下,即路径名含有空格,你再如此调用将会绊个跟头。为什么?因为Shell的第一个参数(字符串)既要包含文件名又要包含命令行,它怎么分哪?只有用空格来区分。所以,一旦路径中包含空格,它就会就查找空格前的文件,并自作聪明地加上exe(或com等其他可执行类扩展名)后执行,这样当然是失败(因为D:\my.exe
”是不存在的)。如何解决?
开动脑筋......。想起来了,我们在开始菜单/运行中运行含空格路径名的程序不是也有此情况吗?输入“d:\my test\test.exe”它会报告找不到d:\my。如图。
[img]http://www.asanscape.com/softshare/img/fileerr.jpg[/img]
我们在前后加上引号就可以了。变成:“"d:\my test\test.exe"”。运行,成功。
于是我们照葫芦画个瓢,在Shell后这个字符串参数中也来个引号。字符串本来就用引号来界定的,如mystr="hello",那么在字符串中再加引号咋办哪?可以这样吗?mystr=""hello""?不可以!你的本意是第1个引号和最后1个引号对应,第2个和倒数第2个引号对应,但VB它不理你,把第1、第2个引号对应为前后引号了,所以这样不行。所以,我们只能用Chr(34)来引用引号。34是引号的ASCII码。“靠,这你也记得呀?”ASCII码我们要记一些,除了大小写字母的首字母外,还要记数字0的ASCII码(48),回车(13),删除(8),空格(32)和我们刚才提到的引号(34)。
于是Shell代码这样写(在loader中画个按钮):
Private Sub Command1_Click()
Dim mystr As String
mystr = Chr(34) & "D:\my test\test.exe" & Chr(34) & " hello"
Shell mystr, vbNormalFocus
End Sub
哎呀,这么罗嗦啊,我用路径时不用带空格的路径不就行了?这不是你说了算的,因为程序路径往往由App.Path得来,而最终用户把你的程序拷到哪里你可以没法控制的。呵呵。
Shell这个函数也真是的,把文件名、命令行眉毛胡子一把抓,真不科学。有没有哪个函数把文件名和命令行作为不同的参数啊?被你猜到了,它就是API函数ShellExecute。
既然是API函数,我们就要先声明它。打开VB6程序组的API Viewer,找到该函数的声明,如下:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String,
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
眼看花了吧?这么多参数?不要怕,很多参数都是NULL。NULL?就是vbNullString啦,其实就是个0。其中第3个参数lpFile就是我们要运行的文件名“d:\my test\test.exe”,第4个参数lpParameters就是命令行"hello",最后一个参数就设为vbNormalFocus。其它的参数嘛,Long型的就设为0,String型的就设为vbNullString。
在loader上再画一个按钮,写上下面代码:
Private Sub Command2_Click()
ShellExecute 0, vbNullString, "D:\my test\test.exe", "hello", vbNullString, vbNormalFocus
End Sub
最后再补充一个常见问题。刚才说到路径名如果没有空格不加引号也行,加了当然也不坏事。那么最终用户一会儿加一会儿不加咋办啊?传入的参数含引号和不含引号等价?当然不等价。把引号去掉就成:
strCmd=Replace(mystr,Chr(34),"")
“上面这行不是把字符串中的引号全去掉嘛?”当然,如果此串指代路径名,除了首尾可能出现引号外,路径中绝不会出现引号(Windows不允许)。如果此串代表其他,则不好说了,为了不把串中的其他可能的引号也一起灭门了,我们还是老实点吧:
If Left(strCmd, 1) = Chr(34) Then strCmd = Mid(strCmd, 2, Len(strCmd) - 2)
好了,写完了。算是给www.9db.cn的见面礼吧。也欢迎加入我们的VB讨论群《VB程序国度》:12960265。文中涉及源码下载地址:[url=http://www.asanscape.com/softshare/cmdline.zip]http://www.asanscape.com/softshare/cmdline.zip[/url]。