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

請問一下我用CreateProcess來執行PING的指令要如何及時輸出?

答題得分者是:Stallion
aki0921
一般會員


發表:13
回覆:11
積分:14
註冊:2007-12-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-12-12 18:32:16 IP:210.243.xxx.xxx 訂閱
各位大大想請問一個問題<就是我用 "cmd.exe  /c ping 192.168.0.1 > test.txt"
可以將結果存入test.txt ,如下:

Reply from 192.168.0.1 bytes=32 time<1ms TTL=128
Reply from 192.168.0.1 : bytes=32 time<1ms TTL=128
Reply from 192.168.0.1 : bytes=32 time<1ms TTL=128
Reply from 192.168.0.1 : bytes=32 time<1ms TTL=128
但是我想要像CMD一樣會一個一個出來要怎麼做內?
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-12-12 19:59:23 IP:123.193.xxx.xxx 訂閱
是這樣嗎?! 

//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Edit1->Text = "www.hinet.net";
AnsiString fn = "test.txt ";
AnsiString s = "ping " Edit1->Text " > " fn;
system(s.c_str());
ListBox1->Items->LoadFromFile(fn);
}
//---------------------------------------------------------------------------

===================引 用 aki0921 文 章===================
各位大大想請問一個問題<就是我用 "cmd.exe /c ping 192.168.0.1 > test.txt"
可以將結果存入test.txt ,如下:

Reply from 192.168.0.1 bytes=32 time<1ms TTL=128
Reply from 192.168.0.1 : bytes=32 time<1ms TTL=128
Reply from 192.168.0.1 : bytes=32 time<1ms TTL=128
Reply from 192.168.0.1 : bytes=32 time<1ms TTL=128
但是我想要像CMD一樣會一個一個出來要怎麼做內?
編輯記錄
jow 重新編輯於 2007-12-12 19:59:56, 註解 無‧
aki0921
一般會員


發表:13
回覆:11
積分:14
註冊:2007-12-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-12-12 22:57:16 IP:61.220.xxx.xxx 訂閱
謝謝大大的回覆!!不過你說的方式跟我目前的一樣
我希望可以做到的是像CMD一樣,他PING一各東西
會一各一各顯示~而不是一次顯示全部
謝謝
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-12-12 23:41:38 IP:75.18.xxx.xxx 未訂閱
以下為轉貼資料,忘了在那個網站裡面收錄的! 沒有試過,請參考~。
[code cpp]
//用管道實現dos命令無視窗.
//有時候在程式中要執行dos命令,而用ShellExecute網網會彈出cmd視窗,十分不爽,用管道實現這個功能其實也挺簡單的.下面就是一個簡單的程式.
//程式主要用了幾個函數CreatePipe,CreateProcess,其他的就是幾個結構,msdn都有說明比較簡單.

AnsiString __fastcall TForm1::DosCommand(AnsiString sCmdline);
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::DosCommand(AnsiString sCmdline)
{
PROCESS_INFORMATION proc = {0}; //關於進程資訊的一個結構
long ret;
bool sPipe;
STARTUPINFO start = {0};
SECURITY_ATTRIBUTES sa = {0};
HANDLE hReadPipe ;
HANDLE hWritePipe;
AnsiString sOutput;
AnsiString sBuffer;
unsigned long lngBytesRead;
char cBuffer[256];
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor=0;
sa.bInheritHandle = TRUE;
sPipe=::CreatePipe(&hReadPipe, &hWritePipe,&sa, 0); //創建管道
if (!sPipe)
{
sOutput="CreatePipe failed. Error: " AnsiString(GetLastError());
Memo1->Lines->Add(sOutput);
return sOutput;
}
start.cb = sizeof(STARTUPINFOA);
start.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
start.hStdOutput = hWritePipe;
start.hStdError = hWritePipe;
start.wShowWindow = SW_HIDE;
sBuffer = sCmdline;
ret =::CreateProcess(0, sBuffer.c_str(), &sa, &sa, TRUE, NORMAL_PRIORITY_CLASS, 0, 0, &start, &proc);
if (ret == 0)
{
sOutput="Bad command or filename";
Memo1->Lines->Add(sOutput);
return sOutput;
}
::CloseHandle(hWritePipe);
do
{
memset(cBuffer,'\0',sizeof(cBuffer));
ret = ::ReadFile(hReadPipe, &cBuffer, 255, &lngBytesRead, 0);
sBuffer=StrPas(cBuffer);
sOutput = sOutput sBuffer;
Memo1->Lines->Add(sBuffer);
Application->ProcessMessages();

} while (ret != 0 );
::CloseHandle(proc.hProcess);
::CloseHandle(proc.hThread);
::CloseHandle(hReadPipe);
return sOutput;
}
//-----------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
DosCommand(Edit1->Text);//Edit1->Text就是你要輸入的dos命令.例如ping 192.168.0.1
}
[/code]
aki0921
一般會員


發表:13
回覆:11
積分:14
註冊:2007-12-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-12-14 09:04:05 IP:210.243.xxx.xxx 訂閱
    原來我是少了do{....}while 這段^^,我是用BCB5.0程式sa.lpSecurityDeforbiddenor=0;要改為sa.lpSecurityDescriptor = 0;
    才可以執行, 謝謝板大提供得資料^^
    不過,我想請問一下,就是我用ping得ping失敗他會一行一行的秀出來
    但是我要是亂打一個指令,
    例如:我在CMD打入"pinh 10.1.1.1"
    他會秀出:
    'pinh' 不是內部或外部命令
    可執行的程式或批次檔。
    或是我打入 "telnet 10.1.1.1"
    他會秀出:
    正連線到 10.1.1.1...
    再來秀出:
    無法開啟到主機的連線, 在連接埠 23: 連線失敗
    可是我在程式中,打入都不會出現這些字眼,請問要如何顯示內?

    [code cpp]
    if (!sPipe)
    {
    sOutput="CreatePipe failed. Error: " AnsiString(GetLastError());
    Memo1->Lines->Add(sOutput);
    return sOutput;
    }//是不是要更改這段程式?

    [/code]


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