全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:8669
推到 Plurk!
推到 Facebook!

要如何 terminate CreateProcess(NULL,"cmd.exe -C ping 127.0.0.1",...)

答題得分者是:gac
berlin
一般會員


發表:2
回覆:5
積分:1
註冊:2007-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-04-24 12:37:47 IP:220.128.xxx.xxx 訂閱
各位大大, 我用CreateProcess 啟動了一個ping 的process, 如下:
CreateProcess(NULL, "cmd.exe -C ping 127.0.0.1 -t", NULL, NULL,
TRUE, NORMAL_PRIORITY_CLASS, NULL, aPath.c_str(),
&StartupInfo, &ProcessInfo)
然後想要用 TerminateProcess(ProcessInfo.hProcess, 0) 來結束它, 可是卻無法成功.
我看了TerminateProcess 的用法, 應該沒錯阿, 問題出在那兒呢? 有誰可以指點我一下呢?
感激不盡.
gac
初階會員


發表:2
回覆:28
積分:26
註冊:2004-08-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-04-24 23:01:25 IP:218.167.xxx.xxx 未訂閱
<textarea class="cpp" rows="10" cols="60" name="code"> STARTUPINFO g_StartupInfo; PROCESS_INFORMATION g_ProcessInformation; void __fastcall TForm1::BitBtn1Click(TObject *Sender) { CreateProcess(NULL, "calc", NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &g_StartupInfo, &g_ProcessInformation); } void __fastcall TForm1::BitBtn2Click(TObject *Sender) { TerminateProcess(g_ProcessInformation.hProcess, 0); } </textarea> 不知道您的程式是怎麼做的,我用上面的程式測試過,可以正常動作~~~
------
我..........還很嫩!
berlin
一般會員


發表:2
回覆:5
積分:1
註冊:2007-04-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-04-25 09:21:31 IP:220.128.xxx.xxx 訂閱
如果我create 的process 是 "notepad.exe" 之類的就可以terminate 掉, 
CreateProcess(NULL, "notepad.exe", NULL, NULL,
TRUE, NORMAL_PRIORITY_CLASS, NULL, aPath.c_str(),
&StartupInfo, &ProcessInfo) ------> 可以terminate

但如果是 "cmd.exe -C mydos.exe" 就無法terminate 掉.
CreateProcess(NULL, "cmd.exe -C ping 127.0.0.1 -t", NULL, NULL,
TRUE, NORMAL_PRIORITY_CLASS, NULL, aPath.c_str(),
&StartupInfo, &ProcessInfo) ------> 無法terminate

不知道為什麼?

我是新手.
gac
初階會員


發表:2
回覆:28
積分:26
註冊:2004-08-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-04-25 10:16:42 IP:220.137.xxx.xxx 未訂閱
<textarea class="cpp" rows="10" cols="60" name="code"> STARTUPINFO g_StartupInfo; PROCESS_INFORMATION g_ProcessInformation; void __fastcall TForm1::BitBtn1Click(TObject *Sender) { CreateProcess(NULL, "ping 127.0.0.1 -t", NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &g_StartupInfo, &g_ProcessInformation); } //--------------------------------------------------------------------------- void __fastcall TForm1::BitBtn2Click(TObject *Sender) { TerminateProcess(g_ProcessInformation.hProcess, 0); CloseHandle(g_ProcessInformation.hProcess); } </textarea> 我試了上面的CODE,一樣是正常可以關閉的, CreateProcess() 的 dwCreationFlags 參數有幾個跟DOS有關的旗標可以設定, 你可以再試試看。
------
我..........還很嫩!
berlin
一般會員


發表:2
回覆:5
積分:1
註冊:2007-04-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-04-25 15:38:56 IP:220.128.xxx.xxx 訂閱
我試了, 
CreateProcess(NULL, "ping 127.0.0.1 -t", NULL, NULL,
TRUE, NORMAL_PRIORITY_CLASS, NULL, aPath.c_str(),
&StartupInfo, &ProcessInfo) ------> 可以terminate

CreateProcess(NULL, "cmd.exe -C ping 127.0.0.1 -t", NULL, NULL,
TRUE, NORMAL_PRIORITY_CLASS, NULL, aPath.c_str(),
&StartupInfo, &ProcessInfo) ------> 無法terminate

我要找出的問題應該是 "cmd.exe -C ping 127.0.0.1 -t" "ping 127.0.0.1 -t" CreateProcess() 中, 差別在哪? 因為我有一個DOS的程式, 必須要用 "cmd.exe -C MyDosApp.exe" 才可以CreateProcess() 成功, 用"MyDosApp.exe" 無法CreateProcess() 成功.

然後就遇到無法 terminate process 的問題了.

謝謝你肯回覆我的問題.
gac
初階會員


發表:2
回覆:28
積分:26
註冊:2004-08-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-04-25 18:25:48 IP:220.137.xxx.xxx 未訂閱
我想我知道問題出在哪了,

CreateProcess(NULL, "ping 127.0.0.1 -t", NULL, NULL,
TRUE, NORMAL_PRIORITY_CLASS, NULL, aPath.c_str(),
&StartupInfo, &ProcessInfo);
是針對 ping 這支程式所建出來的 process,
所以 TerminateProcess() 是把 ping 停掉,
然後 cmd 的視窗是自行結束的

CreateProcess(NULL, "cmd.exe -C ping 127.0.0.1 -t", NULL, NULL,
TRUE, NORMAL_PRIORITY_CLASS, NULL, aPath.c_str(),
&StartupInfo, &ProcessInfo);
而這樣寫則是建出執行 cmd 的 process,
執行 TerminateProcess() 時,雖然執行回傳值為 true,
但是 cmd 內部還有程式在跑,所以沒辦法關掉

不曉得你的 "MyDosApp.exe" 是什麼程式,
不過一般 console 的程式應該都會自動用 cmd 開啟才對,
另外你可以試著加上 CREATE_FORCEDOS 這個旗標,

CreateProcess(NULL, "MyDosApp.exe", NULL, NULL,
TRUE, CREATE_FORCEDOS | NORMAL_PRIORITY_CLASS, NULL, aPath.c_str(),
&StartupInfo, &ProcessInfo);

再試試看有沒有用。
------
我..........還很嫩!
berlin
一般會員


發表:2
回覆:5
積分:1
註冊:2007-04-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-04-26 11:32:18 IP:220.128.xxx.xxx 訂閱
我再把程式看了一下, 想要直接 CreateProcess(NULL, "MyDosApp.exe", ...), 我找到原因了, 我的path 設錯.
現在已經可以直接以
CreateProcess(NULL, "MyDosApp.exe", NULL, NULL,
TRUE, NORMAL_PRIORITY_CLASS, NULL, aPath.c_str(),
&StartupInfo, &ProcessInfo);
來create process 了.

這樣的話, TerminateProcess 也可以work了.

雖然不知道如何把
CreateProcess(NULL, "cmd.exe -C MyDosApp.exe" , NULL, NULL,
TRUE, NORMAL_PRIORITY_CLASS, NULL, aPath.c_str(),
&StartupInfo, &ProcessInfo);
create 出來的process 砍掉, 但是, 問題也算解決了.

謝謝幫忙.

系統時間:2024-04-27 1:59:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!