请教:为何接收不到多个命令行参数

fzx4936 2010-09-03 10:15:25
Sub Main()
On Error GoTo errpro
MsgBox UBound(GetCommandLine)
Exit Sub
errpro:
MsgBox Err.Description
End Sub
Function GetCommandLine(Optional MaxArgs)
'声明变量。
Dim C, CmdLine, CmdLnLen, InArg, I, NumArgs
'检查是否提供了 MaxArgs 参数。
If IsMissing(MaxArgs) Then MaxArgs = 10
' 使数组的大小合适。
ReDim ArgArray(MaxArgs)
NumArgs = 0: InArg = False
'取得命令行参数。
CmdLine = Command()
CmdLnLen = Len(CmdLine)
'以一次一个字符的方式取出命令行参数。
For I = 1 To CmdLnLen
C = Mid(CmdLine, I, 1)
'检测是否为 space 或 tab。
If (C <> " " And C <> vbTab) Then
'若既不是 space 键,也不是 tab 键,
'则检测是否为参数内含之字符。
If Not InArg Then
'新的参数。
'检测参数是否过多。
If NumArgs = MaxArgs Then Exit For
NumArgs = NumArgs + 1
InArg = True
End If
'将字符连接到当前参数中。
ArgArray(NumArgs) = ArgArray(NumArgs) & C
Else
'找到 space 或 tab。
'将 InArg 标志设置成 False。
InArg = False
End If
Next I
'调整数组大小使其刚好符合参数个数。
ReDim Preserve ArgArray(NumArgs)
'将数组返回。
GetCommandLine = ArgArray()
End Function


是代码的原因还是系统的原因?
...全文
184 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fzx4936 2010-09-04
  • 打赏
  • 举报
回复
To bcrun:
有点明白了 看来真是我走入歧途了
先结贴了 换条路重走 遇到麻烦在呼叫你
bcrun 2010-09-04
  • 打赏
  • 举报
回复
楼主你就别笑我了,你看我上月只捞到几百分,都快被CSDN批评了:(

上面说的多个文件拖放的操作,我凭记忆查了下,你是要用activex dll实现DropHandler等东西。

需要注意的是,你应该是把“拖放”或"直接用winrar等在资源管理器右键菜单中注册的菜单项打开“这两种走SHELL接口的方式,和你在楼顶说的这种”打开方式“子菜单里打开的方式混为一谈了。像你这种在”打开方式“子菜单里打开的方式,至少我用winrar和7zip测试都是只能打开一个的。另外,如你没搞DropHandler的话,直接在资源管理器里拖放多个文件到另一个程序文件上的话,结果会是用explorer进程把这多个文件分多次,即打开这个程序文件的多个进程,每次将那多个文件中的一个文件的路径名传给一个新建的进程,这个应该不算是走SHELL接口的,也不能满足你在一个进程的命令行参数中获得多个文件名的需求。

看来你的需求可能不适合找”打开方式“子菜单,而是最好走WINRAR这类软件,直接通过SHELL接呀,在右键菜单中添加打开多个文件的菜单项比较好,这方面的开发资料很多,就不用我去帮你找了吧:)
fzx4936 2010-09-04
  • 打赏
  • 举报
回复
To bcrun:
winRAR 记事本 等这些古老的程序是可以接收到多个参数的 不知道它用的什么办法。您是否可以帮忙找点代码指点一下?
另:我不加到200分你就不现身是吧?

bcrun 2010-09-04
  • 打赏
  • 举报
回复
楼主啊,你两方面都搞错了:
其一,你在"资源管理器"中,通过 ”选取多个文件-右键打开方式-我的程序” 的方式操作时,给这样新打开的程序进程传递的所有命令行参数就是只有一个第一个文件的完整路径名的,你竟想当然的以为一定会传多个了。这个你在sub main里用MsgBox Command()就看得出来了。或者你用别的一些查看进程信息的工具也是可以看出来的

其二,就算只是一个文件的完整路径名,也是那种用双引号引起来的,允许包含空格字符的路径字符串,你找的这个MSDN中的古老的处理简单的多参数的函数根本不适合你这个需求。

你如实在要做这类功能的话,可看看WINDOWS SHELL相关的MSDN资料中,有没有对应你这种操作的COM接口可提供这种文件列表,好像是有的。至少我记得在"资源管理器"中,先选中多个文件,再拖到另一可执行程序上是有这种接口的,当然,这和你的操作还是有点区别的:)
fzx4936 2010-09-04
  • 打赏
  • 举报
回复
To jhone99:
代码是从MSDN中复制的,MSDN说“本示例在某个函数中用 Command 函数获得命令行参数,并将命令行参数以 Variant 类型之数组返回”
To WallesCai:
您没有看我1楼的说明,命令行参数不是手工输入,是通过 ”选取多个文件-右键打开方式-我的程序” 的方式由系统提供的。

我想实现的功能就是右键菜单-打开方式 提供多个文件名给我的程序作为参数
熊孩子开学喽 2010-09-03
  • 打赏
  • 举报
回复
你的思路不对, 首先想想你自己在运行程序加参数的时候难道参数是一个字母算一个参数的么? 你又是如何将多个参数分别输入程序的呢?
答案很简单,那就是分隔符, 空格也好,逗号也好, 对于你的程序来说,接受到的只是一个command字符串, 你如果规定了参数用空格隔开或者逗号隔开,甚至是其他什么的符号隔开,那么你就可以将这个command字符串用相应的分隔符去截断, VB中现成的函数:split就可以做到将一个字符串按照指定的分隔字符将一个长的字符串分隔成一串短的字符串数组.

举例: 你运行: omf.exe aa 22 eee
你的程序中command参数为"aa 22 eee"
你定义:
dim cmd() as string
cmd=split(command," ")
就可以得到:
cmd(0)="aa"
cmd(1)="22"
cmd(2)="eee"
jhone99 2010-09-03
  • 打赏
  • 举报
回复
Function GetCommandLine(Optional MaxArgs)
****************
函数没有返回值

Function GetCommandLine(Optional MaxArgs) as string()
fzx4936 2010-09-03
  • 打赏
  • 举报
回复
续:
假设编译好的程序名为omf.exe
选取若干个文件 右键打开方式、选择程序->omf.exe
获取的命令行参数是一个
求教这是什么原因?

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧