該怎麼利用CreateProcess達成這個需求 |
答題得分者是:ikk
|
dadai
一般會員 發表:29 回覆:31 積分:12 註冊:2009-01-17 發送簡訊給我 |
再次請教各位先進們
利用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 發送簡訊給我 |
|
dadai
一般會員 發表:29 回覆:31 積分:12 註冊:2009-01-17 發送簡訊給我 |
|
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
dadai
一般會員 發表:29 回覆:31 積分:12 註冊:2009-01-17 發送簡訊給我 |
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 發送簡訊給我 |
|
dadai
一般會員 發表:29 回覆:31 積分:12 註冊:2009-01-17 發送簡訊給我 |
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 發送簡訊給我 |
|
dadai
一般會員 發表:29 回覆:31 積分:12 註冊:2009-01-17 發送簡訊給我 |
您好
這是我的程式碼 但是我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 發送簡訊給我 |
|
dadai
一般會員 發表:29 回覆:31 積分:12 註冊:2009-01-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |