大家好,我要写一个小程序,实现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,目前我只想到这两个方法,不知道高手有何建议,或者还有其他的方法可以实现我的要求吗?谢谢大家关注。
2. 找到一个javascript的例子,现在vb中也使用wscript来实现调用,但是总是遇到调试问题,具体可以见我另外一个帖子:http://topic.csdn.net/u/20091027/19/24b302aa-069d-44c5-8b69-9ee250838f6a.html本人以前没写过vb,目前我只想到这两个方法,不知道高手有何建议,或者还有其他的方法可以实现我的要求吗?谢谢大家关注。
一、利用是利用 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 命令。