有时候在程序中要执行dos命令,而用ShellExecute网网会弹出cmd窗口,十分不爽,用管道实现这个功能其实也挺简单的.下面就是一个简单的程序.
程序主要用了几个函数CreatePipe,CreateProcess,其他的就是几个结构,msdn都有说明比较简单.
#include <vcl.h>
#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
}