gpt4 book ai didi

c++ - 如何使 createprocess 重新定向输入成功,我已成功获得重新定向输出结果

转载 作者:行者123 更新时间:2023-11-28 01:49:45 25 4
gpt4 key购买 nike

我在网上查了很多,但大多数都在谈论重定向输出。没有人给出任何成功的重定向输入示例。对于我下面的代码,当我运行命令“ipconfig”或“192.168.0.10”时它给出了正确的输出,因为子进程在运行这些命令后结束,不需要输入。但是当我运行命令“ftp”而不是“ipconfig”时,控制台的子进程正在等待下一个输入命令。如您所见,在这种情况下,我尝试将 11111 作为输入写入控制台。但是控制台没有收到我的输入命令并永远等待输入命令。我怎样才能在这个程序中成功响应“ftp”命令并保持控制台运行

#include <windows.h>
#include <fstream>
using namespace std;

int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpComLine,
int nCmdShow)
{
SECURITY_ATTRIBUTES secAttr;
HANDLE hRead,hWrite;

char command[256];
char testBuf[256] = {0};
strcpy(command, "ipconfig");
// strcpy(command, "ping 192.168.0.10")
// strcpy(command, "ftp");

secAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
secAttr.lpSecurityDescriptor = NULL;
secAttr.bInheritHandle = TRUE;

HANDLE hTxtFile = CreateFile("tmp.txt", GENERIC_ALL, 0, &secAttr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hTxtFile == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Error createfile", NULL, MB_OK);
return 0;
}
HANDLE hWriteFile = CreateFile("Write.txt", GENERIC_WRITE, 0, &secAttr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hWriteFile == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Error createWritefile", NULL, MB_OK);
return 0;
}

STARTUPINFO startupInfo;
PROCESS_INFORMATION processInfo;
startupInfo.cb = sizeof(STARTUPINFO);
GetStartupInfo(&startupInfo);
startupInfo.hStdError = hTxtFile;
startupInfo.hStdOutput = hTxtFile;
startupInfo.hStdInput = hWriteFile;
startupInfo.wShowWindow = SW_SHOW;
startupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

char output[10240] = {0};
DWORD bytesRead;

if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&startupInfo,&processInfo))
{
MessageBox(NULL, "Error createprocess", NULL, MB_OK);
CloseHandle(hWrite);
CloseHandle(hRead);
return FALSE;
}

DWORD processExitCode = 0;
strcpy(testBuf, "11111\r\n");
while (GetExitCodeProcess(processInfo.hProcess, &processExitCode))
{
WriteFile(hWriteFile, testBuf, 7, &bytesRead, NULL);
if (processExitCode != STILL_ACTIVE)
{
// MessageBox(NULL, "End process", NULL, MB_OK);
break;
}
Sleep(1000);
}

SetFilePointer(hTxtFile, NULL, NULL, FILE_BEGIN);
ReadFile(hTxtFile, output, 10240, &bytesRead, NULL);
CloseHandle(hTxtFile);

MessageBox(NULL, output, NULL, MB_OK);

return 0;
}

最佳答案

重定向(不是“reindirecting”)输入和重定向输出一样。当然,数据的流向是相反的。这意味着进程从文件中读取。这反过来意味着当您打开一个句柄进行写入时,就像您在示例代码中所做的那样:

HANDLE hWriteFile = CreateFile("Write.txt", GENERIC_WRITE, ...);

进程将无法从中读取。您必须打开文件进行阅读:

HANDLE hWriteFile = CreateFile("Write.txt", GENERIC_READ, ...);

但是,这也意味着您必须提前准备好要发送给流程的输入。在创建进程后写入文件没有帮助。

如果您事先不知道必须发送给进程的数据,则不能使用文件作为标准输入,而必须使用其他东西,例如(命名或匿名)管道。

关于c++ - 如何使 createprocess 重新定向输入成功,我已成功获得重新定向输出结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43449438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com