winapi 프로그램에서 파이프를 사용하여 scanf, get 등을 사용하는 프로그램을 보내고 싶습니다. 글쓰기는 효과가있는 것처럼 보이지만, 다른 프로그램이이 글을 읽게하려면 어떻게해야합니까?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] 없이는 말할 수 없지만 가장 가능성있는 원인 ("답변"에 추가 정보가 있음)은 행의 마지막을 잊어 버렸거나 * 오른쪽 끝을 보내지 않았다는 것입니다. 선. 완전히 확신 할 수는 없지만이 시나리오에서는 줄 끝 시퀀스 즉, 줄 바꿈 뒤에 오는 캐리지 리턴을 보내야한다고 생각합니다. –
[ "프로세스의 표준 입력과 표준 출력을 파이프로 리디렉션 할 때주의하십시오.]"(https://blogs.msdn.microsoft.com/oldnewthing/20110707-00/?p=10223). 또한 [ "출력을 리디렉션하면 프로그램 동작이 변경 될 수 있습니다"] (https://blogs.msdn.microsoft.com/oldnewthing/20060519-09/?p=31133/). – zett42