使用Borland C ++执行dos命令并保存输出

时间:2012-07-11 13:42:21

标签: c++ c++builder

C ++新手。

我一直在寻找下午的大部分时间,是否有人知道执行DOS命令的简单方法并保存为Windows窗体应用程序的变量?

3 个答案:

答案 0 :(得分:2)

您可以使用system("dir");。这将打开命令提示符并运行dir命令。

或者您可以使用WinExec。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms687393(v=vs.85).aspx

您可以将命令重定向到文本文件,并读取它。

答案 1 :(得分:2)

bool execDosCommand(char *command, AnsiString &output)
{
    SECURITY_ATTRIBUTES sa;
    ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES));
    sa.nLength=sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle=true;
    sa.lpSecurityDescriptor=NULL;
    HANDLE ReadPipeHandle;
    HANDLE WritePipeHandle;       // not used here

    if(!CreatePipe(&ReadPipeHandle, &WritePipeHandle, &sa, 0))
        return false;

    STARTUPINFOA si;
    ZeroMemory(&si,sizeof(STARTUPINFO));
    si.cb=sizeof(STARTUPINFO);
    si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
    si.wShowWindow=SW_HIDE;
    si.hStdOutput=WritePipeHandle;
    si.hStdError=WritePipeHandle;

    PROCESS_INFORMATION pi;
    ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
    text cmd;
    cmd.print("/c %s", command);
    char pathbuf[MAX_PATH];
    _searchenv("CMD.EXE", "PATH", pathbuf);
    if(!CreateProcessA(pathbuf, cmd.t_str(), NULL, NULL, true, 0, NULL, NULL, &si, &pi))
        return false;
    char Data[1024];
    for (;;)
    {
        DWORD BytesRead;
        DWORD TotalBytes;
        DWORD BytesLeft;

        if(!PeekNamedPipe(ReadPipeHandle,Data,sizeof(Data),&BytesRead, &TotalBytes,&BytesLeft)) return false;
        if(BytesRead)
        {
            if(!ReadFile(ReadPipeHandle,Data,sizeof(Data)-1,&BytesRead,NULL))
                return false;
            Data[BytesRead]='\0';
            output += Data;
        }
        else
        {
            if(WaitForSingleObject(pi.hProcess,0)==WAIT_OBJECT_0)
                break;
        }
    }
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    CloseHandle(ReadPipeHandle);
    CloseHandle(WritePipeHandle);
    return true;
}

例如:execDosCommand(“dir C:\”,output);

答案 2 :(得分:0)

如roymustang所述,您可以使用system命令从系统执行另一个命令。这可以是批处理脚本,例如将命令的输出通过管道传输到文本文件中。然后,您可以读取文本文件以实际获取信息。 “返回”命令输出的问题是,命令输出如何?你会在什么数据结构中存储它?大多数情况下,您将获得一堆无格式文本,这些文本无法轻松解析,因此没有真正的通用方法将应用程序或脚本的输出返回到C ++数据结构中。

你不妨想看看这里: http://docwiki.embarcadero.com/RADStudio/en/System,_wsystem

如上所述,我不相信有一种方法可以将应用程序调用的输出返回给您的程序,至少没有我听说过的。

映入眼帘,

弗洛里安