Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 抓取程序';s控制台输出_C++_Windows_Sockets_Console - Fatal编程技术网

C++ 抓取程序';s控制台输出

C++ 抓取程序';s控制台输出,c++,windows,sockets,console,C++,Windows,Sockets,Console,我正在为一家公司创建一个网络管理程序,我目前正在与该公司进行一些合同工作(我想是无关的) 作为程序的一部分,我想要一个console/telnet(类型)克隆。我有一个工作目录系统,在那里我基本上可以读取目录中的所有文件,并更改目录。我也有一个简单的FTP协议设置。然而,我想用标准的输入/输出过程以编程的方式任意地对不同的程序说话。我不反对DLL注入技术和其他方法,因为这是一个良性程序。如果可能的话,如果我可以直接轻松地使用控制台,那就太棒了。(system()可能会工作,但这不允许继续通信或读

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

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

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

TL;医生:


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

最简单的方法通常是生成子程序。这将为您提供一个句柄,用于写入子对象的标准输入或读取子对象的标准输出


如果你需要同时做这两件事,事情会在短时间内变得更加糟糕。您通常必须自己创建匿名管道,并在对的调用中指定它们,坦率地说,这是一个难题。

正如Jerry所提到的,您正在寻找的是一个管道()。实际上有两个——一个用于输入,一个用于输出。然后创建新进程,将它们设置为stdin/stdout/stderr,并传递给。然后你可以使用,和朋友交流

MSDN上提供了完整的示例:

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


PS,在Python中使用这个模块会容易得多。

好的,在过去的一段时间里,我已经了解了很多。以下是一些人们可能会发现有用的信息=]

使用管道/文件描述符创建进程的代码,如Stdin/out/err:

    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描述符。这很快,也很容易


如果您不知道如何将一些插座连接在一起,请查看

谢谢!我以前见过管道,但到目前为止,我还没有对它们做任何处理。这看起来足够了。(再次)谢谢你!这正是我需要的信息,非常感谢!您不应该使用
+
附加标志。始终使用
|
。某些标志重叠,然后您可能会得到意外的结果。