【问题标题】:Grab Program's Console Output抓取程序的控制台输出
【发布时间】:2011-07-09 05:55:21
【问题描述】:

我正在为一家公司创建一个网络管理程序,该公司目前正在与我进行一些合同工作(我想这无关紧要)

作为程序的一部分,我想要一个控制台/远程登录(类型)克隆。我有一个工作目录系统,基本上可以读取目录中的所有文件,并更改目录。我还设置了一个简单的 FTP 协议。但是,我想以编程方式使用标准输入/输出程序任意与不同的程序交谈。我不反对 DLL 注入技术和其他方法,因为这是一个良性程序。如果可能的话,如果我可以轻松地直接使用控制台,那就太棒了。 (system() 可能会工作,但是这不允许继续通信或读回输出)

到目前为止,我一直在考虑获取 PATH 环境变量并将其用于 std 命令(ipconfig、netstat 等)我的网络库使通信变得容易,但我只是不确定如何与程序的控制台交互。 ..

TL;DR:

程序之间是否有任何预定义的标准控制台通信方式?

【问题讨论】:

    标签: c++ windows sockets console


    【解决方案1】:

    正如 Jerry 所说,您正在寻找的是一个管道 (CreatePipe)。其中两个实际上 - 一个用于输入,一个用于输出。然后创建新进程并将它们设置为STARTUPINFO 中的stdin/stdout/stderr 传递给CreateProcess。然后就可以使用WriteFileReadFilePeekNamedPipe和朋友们进行交流了。

    MSDN 上有一个完整的例子:

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

    并确保您不会陷入这些常见的陷阱(幸运的是,Raymond Chen 最近恰好记录了这一点):

    PS,这在 Python 中使用 subprocess 模块要容易得多。

    【讨论】:

    • 谢谢!我以前见过管道,但到目前为止,我还没有对它们做任何事情。这看起来足够了。谢谢(再次)!
    【解决方案2】:

    最简单的方法通常是使用_popen 生成子程序。这将为您提供写入子标准输入或从子标准输出读取的句柄。

    如果你需要同时做这两个,事情会匆忙变得更丑陋。您通常必须自己创建匿名管道并在调用 CreateProcess 时指定它们,坦率地说,这很痛苦。

    【讨论】:

    • 这正是我需要的信息,非常感谢!
    【解决方案3】:

    好吧,我在最近的一段时间里学到了很多。以下是一些可能对某些人有用的信息 =]

    使用管道/文件描述符作为标准输入/输出/错误创建进程的代码:

        STARTUPINFO startInfo;
    
        PROCESS_INFORMATION procInfo;
    
        memset((void*) &startInfo, 0, sizeof (startInfo));
        memset((void*) &procInfo,  0, sizeof (procInfo));
    
        startInfo.cb = sizeof (startInfo);
        startInfo.dwFlags = (STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW);
    
        startInfo.wShowWindow = SW_HIDE; //No Console Window, Thanks.
    
        startInfo.hStdInput   = (HANDLE)inHandle;
        startInfo.hStdOutput  = (HANDLE)outHandle;
        startInfo.hStdError   = (HANDLE)errHandle;
    
        char* pe = "cmd\0"; 
        //This is the program to execute (eg: c:\\Windows\\System32\\cmd.exe)
    
        CreateProcess(NULL,pe,NULL,NULL,TRUE,0,NULL,NULL,&startInfo,&procInfo);
    
        return procInfo.hProcess;
    

    现在这一切都很好,而且很花哨,但是还有一些额外的小消息确实帮助了我。您可以将文件描述符用于句柄(in/out/err),这样您就可以使用直接套接字,无需修改,并且可以直接访问进程的输入和输出。

    所以我目前创建隐藏控制台的方法是在本地将两个套接字连接在一起,然后将其中一个套接字用作调用 cmd 的子程序的 stdInput && stdOutput && stdError 描述符。它又快又容易。

    如果您不知道如何将一些套接字连接在一起,请查看beej's guide

    【讨论】:

    • 您不应该使用+ 附加标志。始终使用|。一些标志重叠,然后您可能会得到意想不到的结果。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多