winapiプログラムからのパイプを使ってscanf、getsなどを使用するプログラムを送信したいと思います。書き込みはうまくいくようですが、他のプログラムにこの入力を読み込ませるにはどうすればいいですか?scanfをパイプ(WinAPI)から読み込みます。
例では、このようなものだ:
int main()
{
HANDLE outputhandlewrite;
HANDLE outputhandleread;
HANDLE inputhandlewrite;
HANDLE inputhandleread;
char gdbpath = ".\SysGCC\bin\arm-linux-gnueabihf-gdb.exe";
char gdbcommand = "help";
SECURITY_ATTRIBUTES saAttr;
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;
BOOL bSuccess
saAttr.nLength = sizeof(saAttr);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
CreatePipe(&outputhandleread,&outputhandlewrite,&saAttr,0);
SetHandleInformation(outputhandleread,HANDLE_FLAG_INHERIT,0);
CreatePipe(&inputhandleread,&inputhandlewrite,&saAttr,0);
SetHandleInformation(inputhandlewrite,HANDLE_FLAG_INHERIT,0);
ZeroMemory(&piProcInfo,sizeof(piProcInfo));
ZeroMemory(siStartInfo,sizeof(siStartInfo));
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,gdbpath,NULL,NULL,TRUE,0,NULL,NULL,&piProcInfo,&siStartInfo);
for (;;)
{
for (i = 0; i < (*ds).mds.mdscs.debuggerlineswidth; i++)
{
bSuccess = ReadFile((*ds).debuggeroutputdata.outputhandle, pipebuffer + i, 1, &bytesread, NULL);
if (*(pipebuffer + i) == '\r')
{
bSuccess = ReadFile((*ds).debuggeroutputdata.outputhandle, pipebuffer + i, 1, &bytesread, NULL);
break;
}
}
*(pipebuffer + i) = 0;
//Here is just Code for printing the received ouput to the window
}
bSuccess = WriteFile((*ds).debuggerinputdata.inputhandle, (*ds).debuggerinputdata.inputstring, strlen((*ds).debuggerinputdata.inputstring) + 1, &byteswritten, NULL);
bSuccess = WriteFile((*ds).debuggerinputdata.inputhandle, (*ds).debuggerinputdata.inputstring, 0, &byteswritten, NULL);
}
プロセスを作成する作業を読み取り、動作し、WriteFile関数は成功を返し、書き込まれたバイトは、入力文字列の長さに等しいです。 enter code here
あなたの投稿を編集して、あなたがこれまで出てきたことを示す[mcve]を追加してください。 – zett42
[mcve]が付いていないと伝えにくいですが、最も可能性の高い原因は(あなたの "答え"の補足情報があります)、行の終わりを忘れていたり、*ライン。私は完全にはわかりませんが、このシナリオでは、Windowsの行末シーケンス、つまり復帰改行と改行を送信する必要があると思います。 –
[プロセスのstdinとstdoutの両方をパイプにリダイレクトすると、デッドロックが発生しやすいので注意してください](https://blogs.msdn.microsoft.com/oldnewthing/20110707-00/?p=10223)。また、[出力をリダイレクトするとプログラム動作が変更される可能性があります](https://blogs.msdn.microsoft.com/oldnewthing/20060519-09/?p=31133/)。 – zett42