2014-01-29 2 views
0

Я пытаюсь использовать DoEvents в моей QTP сценарий - но получаю ошибку - Несоответствие типа: «DoEvents»Как использовать DoEvents в QTP 11?

Ниже мой сценарий:

Const STILL_ACTIVE = &H103 
Const PROCESS_QUERY_INFORMATION = &H400 
Const SYNCHRONIZE = &H100000 
Extern.Declare micHwnd, "CloseHandle", "kernel32", "CloseHandle", micLong 
Extern.Declare micHwnd, "WaitForSingleObject", "kernel32", "WaitForSingleObject", micLong, micLong 
Extern.Declare micHwnd, "OpenProcess", "kernel32", "OpenProcess", micLong, micLong, micLong 
Extern.Declare micHwnd, "GetExitCodeProcess", "kernel32", "GetExitCodeProcess", micLong, micLong 


Public Function Run_XML(exeStr, ByVal logFile) 

Dim pid, ExitEvent 
Dim lineStr 
Dim okFlg 
Dim hProcess 
Dim wait_time 

wait_time = input_details.Items()(19) 

xmlCount = "0" 
okFlg = 0 

Dim SystemProcess 
Set SystemProcess = DotNetFactory.CreateInstance("System.Diagnostics.Process") 

Dim processStartInfo 
Set processStartInfo = DotNetFactory.CreateInstance("System.Diagnostics.ProcessStartInfo") 
processStartInfo.UseShellExecute = false 

processStartInfo.FileName = "plink.exe" 
processStartInfo.Arguments = Chr(34) + " -load " + Chr(34) + session_name + Chr(34) + " -l " + Chr(34) + login_id + Chr(34) + " -pw " + Chr(34) + pwd + Chr(34) + " -m " + Chr(34) + cmd_dir + "commands.txt" + Chr(34) + " >> " + Chr(34) + log_dir & log_filename + Chr(34) 
Dim myProcess 
Set myProcess = SystemProcess.Start(processStartInfo) 
pid = myProcess.Id 

hProcess = Extern.OpenProcess(SYNCHRONIZE, False, pid) 
ExitEvent = Extern.WaitForSingleObject(hProcess, (wait_time + 5) * 1000) 

Do 
    Extern.GetExitCodeProcess hProcess, ExitEvent 
    DoEvents 
Loop While ExitEvent = STILL_ACTIVE 

Extern.CloseHandle(hProcess) 

End Function 

Можете ли вы предложить, если DoEvents действует в QTP или нет? Если нет, то какая-либо другая альтернатива или какой-либо другой способ использовать их?

ответ

1

Если вы просто хотите дождаться завершения процесса перед продолжением, вы можете вызвать Process.WaitForExit().

myProcess.WaitForExit 

Однако, вы заявляете в комментариях на другой ответ, который вы хотите ждать конкретного выхода из процесса консоли. Если вы консоль app/batch file или что-то выводите строки, вы можете прочитать это следующим образом:

'Your other ProcessStartInfo code here. Configure 2 extra options as below. 
processStartInfo.UseShellExecute = false 
processStartInfo.RedirectStandardOutput = true 

Dim myProcess 
Set myProcess = SystemProcess.Start(processStartInfo) 

Dim stdOut 
'Redirect standard output so you can read it. 
Set stdOut = myProcess.StandardOutput 
Do 
    Wait 0, 100 
    'Store the line in a variable and check it for whatever condition you want instead of printing as below. 
    print myProcess.StandardOutput.ReadLine() 
Loop While (not myProcess.HasExited) 
'Get any leftover output at the end of execution. 
print myProcess.StandardOutput.ReadToEnd() 
0

DoEvents не поддерживается QTP.

QTP использует VBScript как свой язык сценариев, а VBScript не поддерживает DoEvents.

+0

Есть ли какая-либо другая альтернатива для 'DoEvents' ?? Я использовал его, чтобы подождать, пока команда пакетного Unix ждет определенного выхода, а затем сломает цикл для дальнейшей обработки. Есть ли что-нибудь, что вы можете помочь/предложить, что можно сделать? – Krishna

+0

Итак, ваш текущий код не без 'DoEvents', т. Е.' Loop While ExitEvent = STILL_ACTIVE'? Также определяется 'STILL_ACTIVE' где-то в вашем коде? Если нет, то цикл не будет работать, поскольку значение будет «Null», поскольку STILL_ACTIVE рассматривается как переменная. Предполагается, что это строка? –

+0

Кроме того, вам не нужно, чтобы DoEvents дождались завершения консольных приложений. –