C++ 抓取程序';s控制台输出
我正在为一家公司创建一个网络管理程序,我目前正在与该公司进行一些合同工作(我想是无关的) 作为程序的一部分,我想要一个console/telnet(类型)克隆。我有一个工作目录系统,在那里我基本上可以读取目录中的所有文件,并更改目录。我也有一个简单的FTP协议设置。然而,我想用标准的输入/输出过程以编程的方式任意地对不同的程序说话。我不反对DLL注入技术和其他方法,因为这是一个良性程序。如果可能的话,如果我可以直接轻松地使用控制台,那就太棒了。(system()可能会工作,但这不允许继续通信或读取输出) 到目前为止,我正在考虑获取PATH环境变量,并将其用于std命令(ipconfig、netstat等),我的网络库使通信变得容易,但我只是不确定如何与程序的控制台接口 TL;医生:C++ 抓取程序';s控制台输出,c++,windows,sockets,console,C++,Windows,Sockets,Console,我正在为一家公司创建一个网络管理程序,我目前正在与该公司进行一些合同工作(我想是无关的) 作为程序的一部分,我想要一个console/telnet(类型)克隆。我有一个工作目录系统,在那里我基本上可以读取目录中的所有文件,并更改目录。我也有一个简单的FTP协议设置。然而,我想用标准的输入/输出过程以编程的方式任意地对不同的程序说话。我不反对DLL注入技术和其他方法,因为这是一个良性程序。如果可能的话,如果我可以直接轻松地使用控制台,那就太棒了。(system()可能会工作,但这不允许继续通信或读
程序之间是否有任何预定义的标准控制台通信方式?最简单的方法通常是生成子程序。这将为您提供一个句柄,用于写入子对象的标准输入或读取子对象的标准输出
如果你需要同时做这两件事,事情会在短时间内变得更加糟糕。您通常必须自己创建匿名管道,并在对的调用中指定它们,坦率地说,这是一个难题。正如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描述符。这很快,也很容易
如果您不知道如何将一些插座连接在一起,请查看谢谢!我以前见过管道,但到目前为止,我还没有对它们做任何处理。这看起来足够了。(再次)谢谢你!这正是我需要的信息,非常感谢!您不应该使用
+
附加标志。始终使用|
。某些标志重叠,然后您可能会得到意外的结果。