2014-01-20 34 views
0

我已經在Excel VBA中編寫了腳本,它工作正常,現在我試圖將相同的東西轉換爲QTP 11.0 - 但是面臨一些問題。Excel VB到QTP 11腳本轉換問題


更新由曉芙根據提示問題 -

什麼是VBA - 殼功能相當於QTP 11?

及以下QTP 11腳本

Extern.Declare micHwnd, "OpenProcess", "kernel32", "OpenProcess", micLong, micLong, micLong 
Extern.Declare micHwnd, "WaitForSingleObject", "kernel32", "WaitForSingleObject", micLong, micLong 
Extern.Declare micHwnd, "CloseHandle", "kernel32", "CloseHandle", micLong 

Const PROCESS_QUERY_INFORMATION = &H400 
Const SYNCHRONIZE = &H100000 
Const SWP_NOMOVE = 2 
Const SWP_NOSIZE = 1 
Const HWND_TOPMOST = -1 
Const HWND_NOTOPMOST = -2 
Const STATUS_PENDING = &H103 
Const STILL_ACTIVE = &H103 
Const WAIT_TIMEOUT = &H102 
Const INFINITE = &HFFFFFFFF 


Public Function test_exe() 

Dim argStr 

    argStr = "cmd.exe /c " + Chr(34) & "plink.exe -load " + Chr(34) + session_name + Chr(34) + " -l " + Chr(34) + login_id + Chr(34) + " -pw " + Chr(34) + dns_pwd + Chr(34) + " -m " + Chr(34) + cmd_dir + "commands.txt" + Chr(34) + " >> " + Chr(34) + log_dir & log_filename + Chr(34) + Chr(34) 
    exeCount = Run_Test(argStr, log_dir + log_filename) 

End Function 


Public Function Run_Test(exeStr, ByVal logFile) 
Dim pid, ExitEvent 
Dim lineStr 
Dim okFlg 
Dim hProcess 

exeCount = "0" 
okFlg = 0 

pid = shell(exeStr, vbHide) 

hProcess = Extern.OpenProcess(PROCESS_QUERY_INFORMATION + SYNCHRONIZE, 0, pid) 
ExitEvent = Extern.WaitForSingleObject(hProcess, 15000) 
Extern.CloseHandle(hProcess) 

Set fso = CreateObject("Scripting.FileSystemObject") 
Set f = fso.OpenTextFile(logFile, ForWriting, True) 
Do 
    f.writeLine lineStr 
    If InStr(1, lineStr, "/home/") > 0 Then okFlg = okFlg + 1 
    exeCount = "1" 
Loop Until EOF(3) 
f.close 

If okFlg >= 1 Then 
    Run_Test = okFlg 
Else 
    Run_Test = -1 
End If 

End Function 

錯誤,我得到的是上線 「**pid = shell(exeStr, vbHide)**」 - 「對象不支持此屬性或方法: '外殼'

有關如何解決此問題的任何建議?

+1

爲了清晰起見,您可能會刪除大部分代碼。你真的只是問「VBA的'shell'函數的UFT/QTP等價物是什麼?」或者「我如何在UFT/QTP中啓動一個進程並獲取進程ID?」。 – Xiaofu

回答

1

我建議你利用DotNetFactory來訪問所有.NET善良:

Dim csProcess 
Set csProcess = DotNetFactory.CreateInstance("System.Diagnostics.Process") 
Dim myProcess 
Set myProcess = csProcess.Start("notepad.exe") 
MsgBox myProcess.Id 

如果你不熟悉或沒有訪問MSDN文檔,這裏是一個例子命令行參數:

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

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

processStartInfo.FileName = "cmd.exe" 
processStartInfo.Arguments = "/c notepad.exe" 
Dim myProcess 
Set myProcess = SystemProcess.Start(processStartInfo) 
msgbox myProcess.Id 
+0

我試着按照你的建議 - 但是出現錯誤 - 「'外部對象System.Diagnostics.Process :: Start拋出以下異常: 系統找不到指定的文件 行(85):」Set myProcess = csProcess。開始(exeStr)'「」 – Krishna

+0

@ Bhavin-Krishna請參閱額外的代碼示例以瞭解如何處理命令行參數和Process類。 http://msdn.microsoft.com/en-us/library/system.diagnostics.process.start%28v=vs.110%29.aspx – Xiaofu

+0

它的工作就像一個魅力...非常感謝..! – Krishna