請教一段程式碼 -- CreatePipe |
答題得分者是:ikk
|
dadai
一般會員 發表:29 回覆:31 積分:12 註冊:2009-01-17 發送簡訊給我 |
我在版上找到一篇文章
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 發送簡訊給我 |
|
dadai
一般會員 發表:29 回覆:31 積分:12 註冊:2009-01-17 發送簡訊給我 |
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 發送簡訊給我 |
|
2007
中階會員 發表:54 回覆:90 積分:98 註冊:2008-08-12 發送簡訊給我 |
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 發送簡訊給我 |
奇怪了!! 為什麼在看的時候是: 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |