在 VB 中呼叫外部程式用 SHELL 獲取 pid 的問題:
Private Sub Command1_Click()
pid = Shell("C:\Program Files\Internet Explorer\iexplore", vbNormalFocus)
End Sub
第一次打開不管是在 WIN7 還是 XP 中都沒問題。
但是當再次點擊 command1 按鈕時,打開 windows任務管理器,發現了一個奇怪的問題:
前提瀏覽器均為 IE8
1、在 win7 中,windows任務管理器中新出現的 ie 行程 pid 與回傳的 pid 不符;
2、在win XP 中,windows 任務管理器中根本就不會再增加 ie 行程;
所以導致 我下一步無法針對 pid 進行 IE 的關閉,求解決思路(注意,我要打開多個 IE 瀏覽器視窗)。
uj5u.com熱心網友回復:
再仔細觀察了一下,準確的說不管是在 XP 還是 WIN7 中第一次運行的時候在任務管理器中會產生一個新的 IE 行程, shell 也能正常捕獲的到但是第二次、第三次運行 shell 的時候任務管理器中會臨時出現新的 IE 行程,但是馬上又消失了。
既然 行程都不在了,所以也就無法完成對指定視窗的關閉了。
==================================================
思考:直接點擊桌面上的 IE 圖示 任務管理器中就會創建 新的 IE 行程,為啥在 VB 中通過 shell 就不能呢?
uj5u.com熱心網友回復:
機器實測沒有毛病.
uj5u.com熱心網友回復:
被我試出來了,加 /new 即可解決。即pid = Shell("C:\Program Files\Internet Explorer\iexplore.exe /new", vbNormalFocus)
但問題又來了,這樣是正確獲取到了pid(后續程式也能關閉了),但打開的同時ie會直接訪問 http://new 。這兒應該如何寫 啊?
uj5u.com熱心網友回復:
悲催的是引數只能 /new 這樣寫,換成 -new 都不行。各位大俠,如何解決?uj5u.com熱心網友回復:
我這兒測驗,加 -new 是可以的。
IE的“特定命令列引數”是用-符號標識的,估計不是用“-”開頭的引數,它就認為是一個URL。
另外,如果僅僅是“試效果”的話,可以試試加引數: -nohome (啟動IE、打開“空白”視窗)
但是我發現一個問題:
如果啟動IE新行程、并指定它打開網址URL1;
但進入URL1時,它會“自動跳轉”到URL2(發生了一次或多次“重定向”),最終新行程的PID跟“啟動行程”時的PID是不一樣的。
uj5u.com熱心網友回復:
Shell “cmd /d taskkill /F /IM iexplore.exe",vbHide
uj5u.com熱心網友回復:
不懂就不要胡說八道!!!

你這樣,豈不是“斬盡殺絕”了!!! 根本就不可能是“結束指定行程”的效果!


uj5u.com熱心網友回復:
我想問你一下你
一、你上面就是一個舉例 用shell打開一個外部程式 ,還是就是要打開ie
二、如果你通過shell打開ie,不知你想做什么操作,還是就是為了關閉?因為程式不知你什么時候操作完成。
三、如果你想打開以后 ,得到pid,可以試試 我給你的函式
Const SYNCHRONIZE = &H100000
Const INFINITE = &HFFFFFFFF
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
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Declare Function WinExec Lib "kernel32" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long
Public Function ShellWait(SheStr As String) As Long
Dim pId As Long, pHnd As Long
pId = Shell(SheStr, vbHide)
pHnd = OpenProcess(SYNCHRONIZE, 0, pId)
If pHnd <> 0 Then
Call WaitForSingleObject(pHnd, INFINITE)
Call CloseHandle(pHnd)
End If
ShellWait = pId
End Function
呼叫方式 :pid=shellwait("C:\Program Files\Internet Explorer\iexplore")
四、如果就是要使用ie,那建議你使用webbrowser控制元件,很方便,隨便控制
uj5u.com熱心網友回復:
再次灰常謝謝各位的熱心。我的問題解決了,也給大家分享一下。我的目標是:利用設定代理IP 來刷流量,主要是IP量哈(用途,有無意義我們就不追究了哈
)1、第一步通過api 獲取到代理IP;
2、設定IE代理服務,訪問指定網頁。
如果利用 webbrowser 控制元件,非常順手。最開始我也是這么做的,為了提高效率,我還用了多個視窗來放 webbrowser 控制元件,每個FORM表單設定各自的代理IP。但是這種方式對 cnzz,51.la 等第三方統計無效(奇怪的是webbrowser 控制元件訪問我的 php 程式 $_SERVER['REMOTE_ADDR'] 顯示的IP是代理IP,思索了很久沒找到問題所以放棄了)
現在的方法是通過代碼修改注冊表直接設定 IE 瀏覽器的代理,第三方統計也認可了。
另外,海鷗軟體 提到的沒法檢測是否完成,何時完成確實是個問題。不過我不管那么多,也不用一直等待,我是定時 kill 掉打開時候的 pid 即可。
uj5u.com熱心網友回復:
補充:如果直接打開 IE 就會有我主題上描述的問題(經過我測驗,只有 IE 有pid這個問題)。解決方法(可能有點笨):另外做一個 exe 檔案,這個 exe 里只放一個 webbrowser 控制元件,再用主程式去 shell 他,即可迂回避開直接 shell ie 造成的 pid 問題不符的問題。
當然呼叫前要先設定代理服務器,用于設定了代理服務器,這個 exe 檔案被 shell 的時候代理就生效了。經測驗,同時shell 多個 exe 都沒問題,而且都是不同的代理,從而解決了效率問題。
如果大家有更好的辦法,歡迎分享。
uj5u.com熱心網友回復:
直接用內置的瀏覽器框好了。樓主這個和我多年前做的一個小程式類似。


uj5u.com熱心網友回復:
樓主你好,其實在VB或者VBA中,想起用IE的話,可以使用CreateObject("INTERNETEXPLORER.APPLICATION"),這個方法,然后打開網址的話,就用oIE.Navigate("http://your-url........")轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/48493.html
標籤:VB基礎類
