程序中进行命令行处理
程序中进行命令行处理,同时修改了控制台默认的输入输出管道,并将控制台隐藏. 本文以BCB6做为例子,调用了一个Win32API CreateProcess(),比较简单,不明白的部分可以在日志下提出. 通过本文加以上一篇的.bat说明,我们可以进行可视化的批量编译.免去了开启大量VC项目一一编译的痛苦.
Author: 自由骑士笃志
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 直接控制台
MyDosCommand("ping www.baidu.com");
// 转接控制台,可以实现更多功能.cmd.exe /c 后加运行参数.
MyDosCommand("cmd.exe /c iexplore hi.baidu.com/freedomknightduzhi");
}
//---------------------------------------------------------------------------
// 调用命令行并且隐藏窗口
AnsiString __fastcall TForm1::MyDosCommand(AnsiString szCmdLine)
{
PROCESS_INFORMATION tagPi = {0} ;
long lRet = 0 ;
bool bPipe = true ;
STARTUPINFO tagStart = {0} ;
SECURITY_ATTRIBUTES tagSa = {0} ;
HANDLE hReadPipe = NULL ;
HANDLE hWritePipe = NULL ;
AnsiString szBuffer;
AnsiString szOutPut;
tagSa.nLength = sizeof(SECURITY_ATTRIBUTES);
tagSa.lpSecurityDescriptor = NULL;
tagSa.bInheritHandle = true;
// 创建输出输入管道
bPipe = CreatePipe(&hReadPipe, &hWritePipe, &tagSa, 0);
if (!bPipe)
{
szOutPut = "创建输出输入管道失败:" + AnsiString(GetLastError());
Memo1->Lines->Add(szOutPut);
return szOutPut;
}
// 填充Start管道信息
tagStart.cb = sizeof(STARTUPINFO);
tagStart.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
tagStart.hStdOutput = hWritePipe;
tagStart.hStdError = hWritePipe;
tagStart.wShowWindow = SW_HIDE;
szBuffer = szCmdLine;
// 创建进程
/*lRet = CreateProcess(NULL, szBuffer.c_str(), &tagSa, &tagSa, NULL,
NORMAL_PRIORITY_CLASS, NULL, NULL, &tagStart, &tagPi); */
lRet = CreateProcess(NULL, szBuffer.c_str(), NULL, NULL, true,
NULL, NULL, NULL, &tagStart, &tagPi);
if (0 == lRet)
{
szOutPut = "命令行输入有误!";
Memo1->Lines->Add(szOutPut);
return szOutPut;
}
// 关闭写入Pipe
CloseHandle(hWritePipe);
// 循环读取结果,
unsigned long ulBufLen ;
DWORD dwReadLen ;
char* szOutPutBuf ;
do
{
szOutPutBuf = (char*)malloc(ulBufLen);
memset(szOutPutBuf, '\0', ulBufLen);
lRet = ReadFile(hReadPipe, szOutPutBuf, ulBufLen, &dwReadLen, NULL);
// szOutPutBuf 就是读取出的内容缓存
Memo1->Lines->Add(szOutPutBuf);
}while(lRet != 0);
// 释放
CloseHandle(tagPi.hProcess);
CloseHandle(tagPi.hThread);
CloseHandle(hReadPipe);
return szOutPut;
}
//---------------------------------------------------------------------------