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

請教一段程式碼 -- CreatePipe

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-01 22:15:22 IP:220.133.xxx.xxx 訂閱
我在版上找到一篇文章
http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=91684
其中Stallion版主貼了一段如何使用CreatePipe的範例程式

但是我在使用上有一個疑問
Stallion版主是這麼寫的
ret = ::ReadFile(hReadPipe, &cBuffer, 255, &lngBytesRead, 0);

sBuffer=StrPas(cBuffer);

sOutput = sOutput sBuffer;

Memo1->Lines->Add(sBuffer);

因為這樣子的結果是把整段字串都重新列印一次
我希望印出的部份不要重複
於是我改成下列的方式
ret = ::ReadFile(hReadPipe, &cBuffer, 255, &lngBytesRead, 0);
sBuffer = StrPas(cBuffer);
Memo1->Lines->Add(sBuffer);

但是這樣子執行執行起來
得到的結果卻是Bad command or file

請問有什麼原因嗎?
sOutput看起來只是儲存目前取得的所有字串
為什麼少了那一行結果會差這麼多?
ikk
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-05 10:38:15 IP:163.28.xxx.xxx 訂閱
問題是出在 CreateProcess 吧??
把你的code post 上來會比較清楚...
------
FPGA驗證, FPGA開發平台, http://smims.com
dadai
一般會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-06 07:17:03 IP:219.90.xxx.xxx 訂閱
ikk您好
因為我是參考Stallion版主的文章
所以程式碼內容大同小異
以下是我的程式碼

[code cpp]
PROCESS_INFORMATION pi;
STARTUPINFO si;
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);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.hStdOutput = hWritePipe;
si.hStdError = hWritePipe;
si.wShowWindow = SW_HIDE;
sBuffer.sprintf("ping 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);
} while( ret != 0 );

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

[/code]
編輯記錄
dadai 重新編輯於 2009-03-06 07:18:21, 註解 無‧
ikk
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-06 08:39:07 IP:163.28.xxx.xxx 訂閱
請給STARTUPINFO初始值
[code cpp]
STARTUPINFO si = {0};
[/code]
------
FPGA驗證, FPGA開發平台, http://smims.com
2007
中階會員


發表:54
回覆:90
積分:98
註冊:2008-08-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-03-06 08:49:57 IP:220.132.xxx.xxx 未訂閱

si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.hStdOutput = hWritePipe;
si.hStdError = hWritePipe;
si.wShowWindow = SW_HIDE;
sBuffer.sprintf("ping 192.168.0.10");

===================引 用 dadai 文 章===================
ikk您好
因為我是參考Stallion版主的文章
所以程式碼內容大同小異
以下是我的程式碼

[code cpp]
PROCESS_INFORMATION pi;
STARTUPINFO si;
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);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.hStdOutput = hWritePipe;
si.hStdError = hWritePipe;
si.wShowWindow = SW_HIDE;
sBuffer.sprintf("ping 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);
} while( ret != 0 );

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

[/code]
2007
中階會員


發表:54
回覆:90
積分:98
註冊:2008-08-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-03-06 08:54:56 IP:220.132.xxx.xxx 未訂閱

奇怪了!!

為什麼在看的時候是: sa.lpSecurityDeforbiddenor = 0; ----> 'lpSecurityDeforbiddenor' is not a member of '_SECURITY_ATTRIBUTES'

可是我引用回覆時,就正確了 ----> sa.lpSecurityDescriptor = 0;


===================引 用 dadai 文 章===================
ikk您好
因為我是參考Stallion版主的文章
所以程式碼內容大同小異
以下是我的程式碼

[code cpp]
PROCESS_INFORMATION pi;
STARTUPINFO si;
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);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.hStdOutput = hWritePipe;
si.hStdError = hWritePipe;
si.wShowWindow = SW_HIDE;
sBuffer.sprintf("ping 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);
} while( ret != 0 );

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

[/code]
dadai
一般會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-03-08 09:51:23 IP:219.90.xxx.xxx 訂閱
原來差了一行結果會差這麼多
是我自己太不小心了

感謝ikk與2007兩位前輩的指導
兩位的方法我都有試過
而且都可以正常執行

因為ikk前輩先回答我的問題
所以我把結案給ikk前輩
請2007前輩包含
系統時間:2017-10-24 1:06:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!