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

Executing dos commands with Borland C++ and saving output

本文关键字:保存 输出 命令 dos Borland C++ 执行 使用      更新时间:2023-10-16

C++新手。

我下午大部分时间都在寻找,有人知道执行DOS命令并保存到windows窗体应用程序变量的简单方法吗?

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

或者,您也可以使用WinExec。

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

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

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]='';
            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:\",输出);

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

你不妨看看这里:http://docwiki.embarcadero.com/RADStudio/en/System,_系统

就像上面描述的那样,我不相信有一种方法可以将应用程序调用的输出返回到程序中,至少我从未听说过这种方法。

贪婪,

Florian