我正在使用一个提供api的应用程序,以便脚本更容易。 基本上,当你写有效的input,它会输出一个答案。 我想使用该输出发送更多的input,例如:
Input: <nodes> Output: 1,56,23 Input <56> Output: "Apple"
我想要做的是写入目标进程STDIN的程序,然后从STDOUT中读取输出。 要做到这一点,我主要是从那里得到的代码:
使用redirectinput和输出创buildsubprocess(Windows) – MSDN
唯一的问题是,为了从subprocess读取,我首先需要closures用于写入它的父进程的句柄,这意味着我不能使用subprocess的输出来写更多的东西。
Python:我怎样才能使ANSI转义代码也在Windows中工作?
我想通过sendinput API发送一些密钥
立即打电话与靠近
目前的C ++最佳实践和IDE
在Windows XP / Vista / 7中获取主音量(通常通过键盘轮增加音量)
这里是从msdn中取得的简化代码:
#include <Windows.h> #include <string> using std::string; HANDLE g_hChildStd_OUT_Rd = NULL; HANDLE g_hChildStd_OUT_Wr = NULL; HANDLE g_hChildStd_IN_Rd = NULL; HANDLE g_hChildStd_IN_Wr = NULL; #define BUFSIZE 4096 void WritetoPipe(string msg); void ReadFromPipe(void); int main() { /* * CREATE PIPES */ Security_ATTRIBUTES saAttr; // Set the bInheritHandle flag so pipe handles are inherited. saAttr.nLength = sizeof(Security_ATTRIBUTES); saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; // Create pipes for the child process's STDOUT and STDIN,// ensures both handle are not inherited CreatePipe(&g_hChildStd_OUT_Rd,&g_hChildStd_OUT_Wr,&saAttr,0); SetHandle@R_326_4045@ion(g_hChildStd_OUT_Rd,HANDLE_FLAG_INHERIT,0); CreatePipe(&g_hChildStd_IN_Rd,&g_hChildStd_IN_Wr,0); SetHandle@R_326_4045@ion(g_hChildStd_IN_Wr,0); /* * CREATE CHILD PROCESS */ TCHAR szCmdline[]=TEXT("target.exe"); STARTUPINFO siStartInfo; PROCESS_@R_326_4045@ION piProcInfo; // Set up members of the PROCESS_@R_326_4045@ION structure. ZeroMemory( &piProcInfo,sizeof(PROCESS_@R_326_4045@ION) ); // Set up members of the STARTUPINFO structure. // This structure specifies the STDIN and STDOUT handles for redirection. ZeroMemory( &siStartInfo,sizeof(STARTUPINFO) ); siStartInfo.cb = sizeof(STARTUPINFO); siStartInfo.hStdError = g_hChildStd_OUT_Wr; siStartInfo.hStdOutput = g_hChildStd_OUT_Wr; siStartInfo.hStdInput = g_hChildStd_IN_Rd; siStartInfo.dwFlags |= STARTF_USESTDHANDLES; CreateProcess(NULL,szCmdline,NULL,TRUE,&siStartInfo,&piProcInfo); // Close handles to the child process and its primary thread. // Some applications might keep these handles to monitor the status // of the child process,for example. CloseHandle(g_hChildStd_OUT_Wr); CloseHandle(g_hChildStd_IN_Rd); CloseHandle(piProcInfo.hProcess); CloseHandle(piProcInfo.hThread); /* * ACTUAL APPLICATION */ WritetoPipe("<nodes>n"); // Need to close the handle before reading CloseHandle(g_hChildStd_IN_Wr); // PROBLEM HERE ReadFromPipe(); WritetoPipe("<56>n"); // I can't,as I have released the handle already system("pause"); return 0; } void WritetoPipe(string msg) { WriteFile(g_hChildStd_IN_Wr,msg.c_str(),msg.size(),NULL); } void ReadFromPipe(void) { DWORD dwRead,dwWritten; CHAR chBuf[BUFSIZE]; BOOL bSuccess = FALSE; HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE); for (;;) { bSuccess = ReadFile(g_hChildStd_OUT_Rd,chBuf,BUFSIZE,&dwRead,NULL); if( ! bSuccess || dwRead == 0 ) break; bSuccess = WriteFile(hParentStdOut,dwRead,&dwWritten,NULL); if (! bSuccess ) break; } }
问题来自这一行:
CloseHandle(g_hChildStd_IN_Wr);
要么我把它放在那里,而且在读完一次之后,我就不能写入到我的subprocess中,否则我将其删除,然后ReadFromPipe卡在一个僵局中。
任何帮助将不胜感激,谢谢!
Windows语音识别C#
C# – 使用Process.Start使用计划任务
电子Readline
如何在python脚本中使用speedtest-cli或其他替代方法而不是命令行?
ReadFile(...,BUFSIZE)表示“等到程序写入BUFSIZE个字节,或者关闭它的管道末端”。 程序只写少量的字节,然后等待更多的输入,而不是你提供的。 如果你关闭了写管道,它知道没有更多的输入,并退出,在这一点你的ReadFile知道没有更多的输入和返回。 您需要找到一种方法来读取管道中的字节数。
这里的魔术片是PeekNamedPipe ,它告诉你程序输出了多少数据,因此你可以读取多少数据而不会阻塞。 请注意,您将不得不每隔一段时间检查一次,以查看自上次检查以来程序是否写入了更多字节。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。