大家好,我要写一个小程序,实现vb程序调用scp2来接收文件,现在纠结于到底怎么实现对scp2的调用:1. 使用shell命令可以实现调用scp2,但是无法获取到返回值,而且执行完shell命令,不会等后台的文件传输完毕,就会继续执行下面的命令行,无法等待文件传输后通过返回值判断是否传输成功。
2. 找到一个javascript的例子,现在vb中也使用wscript来实现调用,但是总是遇到调试问题,具体可以见我另外一个帖子:http://topic.csdn.net/u/20091027/19/24b302aa-069d-44c5-8b69-9ee250838f6a.html本人以前没写过vb,目前我只想到这两个方法,不知道高手有何建议,或者还有其他的方法可以实现我的要求吗?谢谢大家关注。

解决方案 »

  1.   

    是的,一定要用scp2传输,有啥办法不?
      

  2.   

    执行 Shell 并等待完成的方法有四种: 
    一、利用是利用 Win32 API 的 FindWindow 函数    该函数可以搜索指定标题或类的窗口,你可以在调用第一个可执行文件后用FindWindow函数去找指定的窗口,如果找到了,就说明第一个文件还未运行完,等待,直到用FindWindow函数找不到指定窗口,就可以调用第二个文件。这种方法简单,但有个毛病,就是如果满足条件的窗口不只一个,比如用户打开了两个有相同类或标题的窗口(一个是VB程序打开的,而另一个可能是用户自行打开的),那么除非用户关闭这两个窗口,否则VB程序不会继续运行。比如 Wise Install 生成的安装程序就有这个毛病,它在安装过程中可能会用 NotePad 打开 ReadMe 文件,等用户看完 ReadMe 文件关闭窗口后继续安装,但如果用户此时用 NotePad 打开了其他文件,安装程序就会继续等待,因为 FindWindow 函数找到了 NotePad 窗口,可实际上这个窗口跟安装程序毫无关系。 二、利用Windows 95新增加的命令Start。这个命令可以调用Windows程序,通常用在批文件中。它有一个/w开关,在被调用的程序继续运行结束之前等待。比如,你要调用的三个可执行文件为Command1、Command2和Command3,你可以构造一个批文件如下: 
         Start/w Command1 
         Start/w Command2 
         Start/w Command3 
       这个方法可以保证三个按既定顺序运行,但VB程序不能知道什么时候该批文件执行完毕。
     
    三、利用 Windows API 的 OpenProcess 和 CloseHandle 函数来实现对被调用软件的检测
     
        1) 在 VB 中新建一个标准 EXE 工程; 
        2) 在 Form1 中声明 OpenProcess 和 CloseHandle 这两个 Windows API 函数:Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long     3) 然后编写下面的函数: 
         Function IsRunning(ByVal ProgramID) As Boolean ' 传入进程标识ID 
         Dim hProgram As Long '被检测的程序进程句柄 
         hProgram = OpenProcess(0, False, ProgramID) 
         If Not hProgram = 0 Then 
         IsRunning = True 
         Else 
         IsRunning = False 
         End If 
         CloseHandle hProgram 
         End Function     4) 在Form_Click()中加入代码: 
         Sub Form_Click() 
         Dim X 
         Me.Caption = "开始运行" 
         X = Shell("NotePad.EXE", 1) 
         While IsRunning(X) 
         DoEvents 
         Wend 
         Me.Caption = "结束运行" 
         End Sub  四、利用 Win32 API 的 CreateProcess 函数和 WaitForSingleObject 函数来进行这一工作。它的原理比较复杂,在此只介绍如何使用。首先建立一个模块( module),然后输入以下语句: 
        Option Explicit 
         
        Type STARTUPINFO 
         cb As Long 
         lpReserved As String 
         lpDesktop As String 
         lpTitle As String 
         dwX As Long 
         dwY As Long 
         dwXSize As Long 
         dwYSize As Long 
         dwXCountChars As Long 
         dwYCountChars As Long 
         dwFillAttribute As Long 
         dwFlags As Long 
         wShowWindow As Integer 
         cbReserved2 As Integer 
         lpReserved2 As Long 
         hStdInput As Long 
         hStdOutput As Long 
         hStdError As Long 
        End Type     Type PROCESS_INFORMATION 
         hProcess As Long 
         hThread As Long 
         dwProcessID As Long 
         dwThreadID As Long 
        End Type     Global Const NORMAL_PRIORITY_CLASS = &H20& 
        Global Const INFINITE = -1& 
        Declare Function CloseHandle Lib "kernel32" (hObject As Long) As Boolean 
        Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long 
        Declare Function CreateProcessA Lib "kernel32" ( _ 
         ByVal lpApplicationName As Long, _ 
         ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal _ 
         lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal _ 
         dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal _ 
         lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, _ 
         lpProcessInformation As PROCESS_INFORMATION) As Long 
         
        Public Sub ShellAndWait(cmdline$) 
         Dim NameOfProc As PROCESS_INFORMATION 
         Dim NameStart As STARTUPINFO 
         Dim X As Long 
         
         NameStart.cb = Len(NameStart) 
         X = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, _ 
         0&, 0&, NameStart, NameOfProc) 
         X = WaitForSingleObject(NameOfProc.hProcess, INFINITE) 
         X = CloseHandle(NameOfProc.hProcess) 
        End Sub 
     
       建立一个窗体,并放一个命令按钮(Command1)在其上。在 Command1_Click 事件中输入以下内容: 
        Private Sub Command1_Click() 
         Dim AppToLaunch As String 
         
         AppToLaunch = "c:\win95\notepad.exe" 
         ShellAndWait AppToLaunch 
        End Sub
     
        运行该程序,按下 Command1,就会调用 NotePad,在 NotePad 运行完毕之前,VB 程序不会继续执行。你可以在程序中使用 ShellAndWait 来代替 Shell 命令。 
      

  3.   

    如果要使用wsh先要通过“工程\引用”菜单项,把“Windows Script Host Object Modle”一项引用到工程中。如果没有,说明没有安装。可通过下面的方法安装:我的电脑→控制面板→添加/删除程序→安装WINDOWS→附件→Windows scripting host→确定。