私はインターネット上で多くを検索しましたが、誰も何らかのリインドリターン入力の例を成功させることはできません。以下の私のコードでは、コマンド "ipconfig"または "192.168.0.10"を実行したときに正しい出力が得られました。しかし、 "ipconfig"の代わりにコマンド "ftp"を実行すると、コンソールである子プロセスが次の入力コマンドを待っています。この場合、11111を入力としてコンソールに書き込もうとしました。しかし、コンソールは私の入力コマンドを受信せず、入力コマンドを永久に待っていませんでした。どのようにすることができます私は正常に応答、このプログラムでは、「FTP」コマンドへとどのように私はcreateprocess reindirect input successを成功させることができますか?私はsuccessally reindirect out put結果を得ることができます
#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プロパティを使用します。 create processは非対話型コンソールを作成します。つまり、create process呼び出しで1つのコマンドラインしか実行できません。任意のアイデアを私は最後のコンソール出力に応じてユーザー入力を取る対話型のリダイレクトコンソールを作成するcreateprocessを使用できますか?ありがとうございました –