0

C++ 新手。

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

4

3 回答 3

2

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

或者,您可以使用 WinExec。

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

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

于 2012-07-11T13:52:10.203 回答
1
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);

于 2012-07-19T19:19:28.263 回答
0

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

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

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

问候,

弗洛里安

于 2012-07-11T15:13:28.077 回答