線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4858
推到 Plurk!
推到 Facebook!

該怎麼利用CreateProcess達成這個需求

答題得分者是:ikk
dadai
一般會員


發表:29
回覆:31
積分:12
註冊:2009-01-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-08 16:12:28 IP:220.133.xxx.xxx 訂閱
再次請教各位先進們
利用command line可以下一些登入的指令
例如 telnet 之類的指令
之後會跳到 telnet 的操作介面下
要離開 telnet 操作介面必須先輸入 quit
才會回到 command line 的介面

請問關於類似的行為
我該怎麼利用 CreateProcess 來實現?

以我目前對 CreateProcess 的認知
CreateProcess 開出一個 command line 視窗之後
執行給予的指令完畢之後就會馬上關閉
是否有可能可以讓該 command line 一直存在
使得程式可以持續的對該 command line process 下指令
等我們想要執行的指令都執行完畢之後
再把該 commnad line process 關閉

如果 CreateProcess 可以達成這個需求的話
想請問是否有相關的程式碼可以參考?

先在這邊感謝回答的先進們
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-09 10:32:51 IP:163.28.xxx.xxx 訂閱
再搭配CreatePipe
------
FPGA驗證, FPGA開發平台, http://smims.com
dadai
一般會員


發表:29
回覆:31
積分:12
註冊:2009-01-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-09 21:19:12 IP:122.116.xxx.xxx 訂閱
ikk您好

關於搭配CreatePipe
我想請教一些問題

1. CreateProcess 執行一行命令之後就會結束,該怎麼保持這個 handle ?
2. CreatePipe 是否需要搭配 overlapper ?
3. 是否有範例程式可以參考?我對於這些Win32 API的使用還很陌生

感謝您的回覆

===================引 用 ikk 文 章===================
再搭配CreatePipe
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-10 08:18:25 IP:163.28.xxx.xxx 訂閱
CreateProcess最後一個參數,PROCESS_INFORMATION,就是此process的information.
程式請參考以下link
http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=91684
------
FPGA驗證, FPGA開發平台, http://smims.com
dadai
一般會員


發表:29
回覆:31
積分:12
註冊:2009-01-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-03-11 17:04:21 IP:219.90.xxx.xxx 訂閱
ikk您好
可能是我的能力太差
無法明確瞭解你的意思

我有參考過Stallion版主的那篇文章
但是我卡關的幾個地方是
1. CreateProcess 執行完畢之後就會把command視窗關閉,我無法繼續對同一個console繼續下指令
2. Stallion版主的那篇文章,當我把sBuffer換成我自己的command: telnet 192.168.0.10,但是卻沒接收到任何東西

打的比方
我想依序送出下列指令
telnet 192.168.0.10
root (telnet 帳號)
12345 (telnet 密碼)
ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up
ping 192.168.1.11
exit (離開 telnet)
exit (離開 console)

以上指令我在cmd下都有試驗過,確實是可以運作的
只是不知道該如何利用程式來實驗

感謝您的指導


===================引 用 ikk 文 章===================
CreateProcess最後一個參數,PROCESS_INFORMATION,就是此process的information.
程式請參考以下link
http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=91684
編輯記錄
dadai 重新編輯於 2009-03-11 20:19:19, 註解 無‧
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-03-11 17:11:42 IP:163.28.xxx.xxx 訂閱
把code post上來看吧...
------
FPGA驗證, FPGA開發平台, http://smims.com
dadai
一般會員


發表:29
回覆:31
積分:12
註冊:2009-01-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-03-11 17:20:17 IP:219.90.xxx.xxx 訂閱
ikk您好
這是我的上一篇文章
http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=97380

我有把 STARTUPINFO si = {0};

整段程式的差別只在於
把 sBuffer.sprintf("ping 192.168.0.10");
換成 sBuffer.sprintf("telnet 192.168.0.10");


再順便請教另外一個問題
我在執行某些command的時候
會得到這樣的訊息
Unable to read from standard input: 控制碼無效。

不知道是我有什麼設定遺漏了嗎?


===================引 用 ikk 文 章===================
把code post上來看吧...
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-03-11 17:46:39 IP:163.28.xxx.xxx 訂閱
Unable to read from standard input: 控制碼無效。
應該是你執行的command包含路徑 '\' 吧....
在字串中要用'\\"
如 "c:\\temp\\run.exe"
------
FPGA驗證, FPGA開發平台, http://smims.com
dadai
一般會員


發表:29
回覆:31
積分:12
註冊:2009-01-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-03-11 20:23:53 IP:219.90.xxx.xxx 訂閱
您好
這是我的程式碼

但是我telnet指令的結果卻沒有任何回傳的訊息
但是直接用cmd下指令確實是有東西的
所以想要請教我程式應該怎麼修改?
才能符合我想達成的目的

再次麻煩您了


[code cpp]
PROCESS_INFORMATION pi;
STARTUPINFO si = {0};
SECURITY_ATTRIBUTES sa;
HANDLE hReadPipe;
HANDLE hWritePipe;
AnsiString sOutput;
AnsiString sBuffer;
long ret;
bool sPipe;
unsigned long BytesRead;
char cBuffer[256];

MemoMsg->Clear();

sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = 0;
sa.bInheritHandle = TRUE;
sPipe = CreatePipe( &hReadPipe, &hWritePipe, &sa, 0 );

if( !sPipe )
{
sOutput = "CreatePipe failed. Error: " AnsiString(GetLastError());
MemoMsg->Lines->Add(sOutput);
return;
}

si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.hStdOutput = hWritePipe;
si.hStdError = hWritePipe;
si.wShowWindow = SW_HIDE;
sBuffer.sprintf("telnet 192.168.0.10");
ret = CreateProcess( 0, sBuffer.c_str(), &sa, &sa, TRUE, NORMAL_PRIORITY_CLASS,
0, 0, &si, & pi );

if( ret == 0 )
{
sOutput = "Bad command or filename";
MemoMsg->Lines->Add(sOutput);
return;
}

CloseHandle(hWritePipe);

do {
memset( cBuffer, '\0', sizeof(cBuffer) );
ret = ReadFile( hReadPipe, &cBuffer, 255, &BytesRead, 0 );
sBuffer = StrPas(cBuffer);
MemoMsg->Lines->Add(sBuffer);
Application->ProcessMessages();
} while( ret != 0 );

CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hReadPipe);

[/code]
編輯記錄
dadai 重新編輯於 2009-03-11 22:33:13, 註解 無‧
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-03-12 08:50:11 IP:163.28.xxx.xxx 訂閱
我試過的確使用telnet的話將無訊息印出...
我想可能telnet使用另外的技術將訊息印出在cmd window..
導致pipe無法接收...
另外有API或許可以試試,
ReadConsoleOutput和WriteConsoleOutput
------
FPGA驗證, FPGA開發平台, http://smims.com
dadai
一般會員


發表:29
回覆:31
積分:12
註冊:2009-01-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-03-12 20:47:40 IP:122.116.xxx.xxx 訂閱
嗯嗯
我會試試看這兩個指令
十分感謝ikk前輩
你耐心的指導了我這麼多東西

===================引 用 ikk 文 章===================
我試過的確使用telnet的話將無訊息印出...
我想可能telnet使用另外的技術將訊息印出在cmd window..
導致pipe無法接收...
另外有API或許可以試試,
ReadConsoleOutput和WriteConsoleOutput
系統時間:2017-10-19 18:58:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!