我在互聯網上搜索了很多,但他們大多數都在談論reindirect輸出。沒有人給出任何成功的reindirect輸入示例。對於我下面的代碼,當我運行命令「ipconfig」或「192.168.0.10」時,它會給出正確的輸出,因爲在運行這些命令後子進程結束,不需要輸入。但是當我運行命令「ftp」而不是「ipconfig」時,控制檯的子進程正在等待下一個輸入命令。正如你所看到的,我試圖在這種情況下將11111作爲輸入寫入控制檯。然而,控制檯沒有收到我的輸入命令並永遠等待輸入命令。我怎樣才能成功地應對這個計劃「ftp」的命令,並保持控制檯運行我怎樣才能讓createprocess reindirect輸入成功,我已經成功地獲得reindirect輸出結果
#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;
}
1)需要關閉句柄,你不做2)'hStdInput'必須有'FILE_GENERIC_READ'訪問3)大多數程序時查看空輸入('NumberOfBytesRead == 0'或* ZwReadFile *回報* STATUS_END_OF_FILE *)只需退出 - 所以你的代碼將不會與文件系統文件一起工作。或者在創建進程之前需要將數據寫入'hStdInput' *。 – RbMm
4)一般說明 - 在使用同步共享文件時使用它 - 不正確 - 文件共享* CurrentByteOffset *。當你調用* WriteFile *時,你可以不從你認爲的位置寫入,因爲子進程可以改變位置(這可以避免在* OVERLAPPED *中使用直接偏移)。你的寫改變* CurrentByteOffset *在共享文件對象,並影響子進程5)使用'processExitCode!= STILL_ACTIVE'不是100%可靠的方式 - 如果子調用ExitProcess(STILL_ACTIVE)'? – RbMm
我已經在我的項目中找到了問題,所以基本上在我們使用STARTF_USESTDHANDLES屬性時。 createprocess將創建非交互式控制檯,這意味着它只能在createprocess調用中運行一個命令行。任何想法我可以使用createprocess創建一個交互式重定向控制檯,它根據最後的控制檯輸出接受用戶輸入?非常感謝 –