2017-09-16 16 views
-1

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

+0

あなたの投稿を編集して、あなたがこれまで出てきたことを示す[mcve]を追加してください。 – zett42

+0

[mcve]が付いていないと伝えにくいですが、最も可能性の高い原因は(あなたの "答え"の補足情報があります)、行の終わりを忘れていたり、*ライン。私は完全にはわかりませんが、このシナリオでは、Windowsの行末シーケンス、つまり復帰改行と改行を送信する必要があると思います。 –

+1

[プロセスのstdinとstdoutの両方をパイプにリダイレクトすると、デッドロックが発生しやすいので注意してください](https://blogs.msdn.microsoft.com/oldnewthing/20110707-00/?p=10223)。また、[出力をリダイレクトするとプログラム動作が変更される可能性があります](https://blogs.msdn.microsoft.com/oldnewthing/20060519-09/?p=31133/)。 – zett42

答えて

0

CreateProcessを使用する場合は、STARTUPINFOインスタンスを渡して、読み取ったパイプの最後を標準入力ハンドルとして渡します。

正しく思い出すなら、継承可能なハンドルを持つパイプを作成する必要があります。

+0

子プロセスをリダイレクトするためにNamed Pipeは必要ありません。匿名のパイプで十分です。 – zett42

+0

@ zett42 oops:私はいつもWin32にもそういうものがあることを忘れているようです。 – Richard

+1

@ zett42 - 匿名パイプこれは名前付きパイプと同じです。同じオブジェクト、(win7から始まる)またはランダムな名前 – RbMm

関連する問題