程序中进行命令行处理,同时修改了控制台默认的输入输出管道,并将控制台隐藏. 本文以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;
}
//---------------------------------------------------------------------------