請問如何關閉一個正在運行的程序 |
尚未結案
|
steven_df2008
一般會員 ![]() ![]() 發表:8 回覆:15 積分:4 註冊:2003-10-22 發送簡訊給我 |
|
seaturn99
版主 ![]() ![]() ![]() ![]() 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
steven_df2008 您好: 請參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=43101
有 kill by Program Name 的方法..
function GetPIDByProgramName(const APName: string): THandle; var isFound: boolean; AHandle, AhProcess: THandle; ProcessEntry32: TProcessEntry32; APath: array[0..MAX_PATH] of char; begin Result := 0; AHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); try ProcessEntry32.dwSize := Sizeof(ProcessEntry32); isFound := Process32First(AHandle, ProcessEntry32); while isFound do begin AhProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, ProcessEntry32.th32ProcessID); GetModuleFileNameEx(AhProcess, 0, @APath[0], sizeof(APath)); if (UpperCase(StrPas(APath)) = UpperCase(APName)) or (UpperCase(StrPas(ProcessEntry32.szExeFile)) = UpperCase(APName)) then begin Result := ProcessEntry32.th32ProcessID; break; end; isFound := Process32Next(AHandle, ProcessEntry32); end; finally closeHandle(AHandle); end; end; function KillProcessByID(APID: THandle): boolean; var AhProcess: THandle; begin // The OpenProcess function returns a handle of an existing process object. AhProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, APID); Result := TerminateProcess(AhProcess, 0); end; ... ... var APID: THandle; begin APID := GetPIDByProgramName(Edit4.Text); if not KillProcessByID(APID) then ShowMessage('Can not Kill The Process PID = ' IntToStr(APID)); end;希望能對您有幫助 ... |
steven_df2008
一般會員 ![]() ![]() 發表:8 回覆:15 積分:4 註冊:2003-10-22 發送簡訊給我 |
SouthWind 您好!
我這裡出現如下錯誤提示:
[Error] fornet.pas(36): Unsatisfied forward or external declaration: 'TForm1.GetPIDByProgramName'
[Error] fornet.pas(37): Unsatisfied forward or external declaration: 'TForm1.KillProcessByID'
看完你的代碼後我不是很清楚,對這每一個函數都還可以看懂,
你是如何想到將CreateToolhelp32Snapshot、Process32First、
OpenProcess、GetModuleFileNameEx、Process32Next、
TerminateProcess這些個api函數聯合起來使用的.
煩請告之,Thanks! 多來一次KTOP多學一些Delphi
|
seaturn99
版主 ![]() ![]() ![]() ![]() 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: SouthWind 您好! 我這裡出現如下錯誤提示: [Error] fornet.pas(36): Unsatisfied forward or external declaration: 'TForm1.GetPIDByProgramName' [Error] fornet.pas(37): Unsatisfied forward or external declaration: 'TForm1.KillProcessByID' 看完你的代碼後我不是很清楚,對這每一個函數都還可以看懂, 你是如何想到將CreateToolhelp32Snapshot、Process32First、 OpenProcess、GetModuleFileNameEx、Process32Next、 TerminateProcess這些個api函數聯合起來使用的. 煩請告之,Thanks! 多來一次KTOP多學一些Delphi可能是您在 implementation 區段的 Code 拼字有誤... 檢查一下 宣告 與 implementation 是否名稱一致?? 至於 CreateToolhelp32Snapshot、Process32First、 OpenProcess、GetModuleFileNameEx、Process32Next、 TerminateProcess 會想到這些 Windows API 的使用,起因是站內的某篇討論, 內容是討論如何找到特定的 Process ,FindWindow 應該是 最簡單好用的,但是對於不是 Window ,沒有或重複 Title 的 Window 並不方便,所以另有一解法是透過 Process 下手... 說起來很汗顏,我第一次看到那些文章的時候,程式碼根本看不懂.. 後來是去讀了 Matt Pietrek 的 "歷史書" Windows 95 System Programming SECRETS,才對 Windows 系統底層的基本運作有些了解.. 看完後才看懂 (很奇怪,我有了觀念後,程式碼豁然開朗) 其實寫到現在,覺得 Programmer 難避免要跟 Windows API 打交道, Delphi RAD 帶來莫大的便利,卻隱藏了許多複雜的動作, RAD 無原罪, 也不用閉門造車堅持全 SDK 手工打造,有作業系統架構的觀念,加上熟練的 Programming 技巧,才能隨心所欲打造自己的想要的程式... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- |
steven_df2008
一般會員 ![]() ![]() 發表:8 回覆:15 積分:4 註冊:2003-10-22 發送簡訊給我 |
function TForm1.KillProcessByID(APID: THandle):boolean;
var
AhProcess: THandle;
begin
// The OpenProcess function returns a handle of an existing process object.
AhProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, APID);
Result := TerminateProcess(AhProcess, 0);
end;
我在書寫時少了紅色部分所以報錯了>
這兩個function通過調試跟蹤,加上一邊看Delphi中的幫助基本看懂了.
您說的那本書我也已經download下來了會仔細看的!
我也會經常來KTOP的,有問題還請您多幫忙.
|
seaturn99
版主 ![]() ![]() ![]() ![]() 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: function TForm1.KillProcessByID(APID: THandle):boolean; var AhProcess: THandle; begin // The OpenProcess function returns a handle of an existing process object. AhProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, APID); Result := TerminateProcess(AhProcess, 0); end; 我在書寫時少了紅色部分所以報錯了> 這兩個function通過調試跟蹤,加上一邊看Delphi中的幫助基本看懂了. 您說的那本書我也已經download下來了會仔細看的! 我也會經常來KTOP的,有問題還請您多幫忙. |
steven_df2008
一般會員 ![]() ![]() 發表:8 回覆:15 積分:4 註冊:2003-10-22 發送簡訊給我 |
不會吧您花了700 大洋,RMB也有170左右!It's too expensive 我也是最近剛上這兒來的所以是新人一個啊,還請您多多指教. 您是programmer嗎?我是個學計算機的,寫程序嗎真的不咱樣,
現在工作以后(生技工程師)學編程的時間更少了,公司(台資公
司)里對我們的電腦做了限制所以一直不可以上網,不過現在
我通過國外的代理服務器終于可以上了,因為要通過外部代理
所以嗎速度真的有點讓人受不了. 好,就這樣吧! 話不多說,讓我們一起在KTOP學習~~進步~~再學習!
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |