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”。如图:


    这下好了,这个用处可多哪。我们可以在另一个程序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。如图。

我们在前后加上引号就可以了。变成:“"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)
    好了,写完了。

vb编程常用命令集锦 vb编程常用命令集锦 API函数声明 数据类型与"类型安全" 常 数 结 构 小 结 一些API函数集: 控件与消息函数、硬件与系统函数、菜单函数、绘图函数 什么是API 首先,有必要向大家讲一讲,什么是API。所谓API本来是为C和C++程序员写的。API说来说去,就是一种函数,他们包含在一个附加名为DLL的动态连接库文件中。用标准的定义来讲,API就是Windows的32位应用程序编程接口,是一系列很复杂的函数,消息和结构,它使编程人员可以用不同类型的编程语言编制出的运行在Windows95和Windows NT操作系统上的应用程序。可以说,如果你曾经学过VC,那么API对你来说不是什么问题。但是如果你没有学过VC,或者你对Windows95的结构体系不熟悉,那么可以说,学习API将是一件很辛苦的事情。 如果你打开WINDOWS的SYSTEM文件夹,你可以发现其中有很多附加名为DLL的文件。一个DLL中包含的API函数并不只是一个,数十个,甚至是数百个。我们能都掌握它嘛?回答是否定的∶不可能掌握。但实际上,我们真的没必要都掌握,只要重点掌握Windos系统本身自带的API函数就可以了。但,在其中还应当抛开掉同VB本身自有的函数重复的函数。如,VB 的etAttr命令可以获得文件属性,SetAttr可以设置文件属性。对API来讲也有对应的函数 GetFileAttributes和SetFileAttributes,性能都差不多。如此地一算,剩下来的也就5、600个。是的,也不少。但,我可以敢跟你说,只要你熟悉地掌握100个,那么你的编程水平比现在高出至少要两倍。尽管人们说VB和WINDOWS具有密切的关系,但我认为,API更接近 WINDOWS。如果你学会了API,首要的收获便是对WINDOWS体系结构的认识。这个收获是来自不易的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值