2017-09-16 1 views
-1

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

+0

게시물을 편집하여 지금까지 작성한 내용이 표시된 [mcve]를 추가하십시오. – zett42

+0

[mcve] 없이는 말할 수 없지만 가장 가능성있는 원인 ("답변"에 추가 정보가 있음)은 행의 마지막을 잊어 버렸거나 * 오른쪽 끝을 보내지 않았다는 것입니다. 선. 완전히 확신 할 수는 없지만이 시나리오에서는 줄 끝 시퀀스 즉, 줄 바꿈 뒤에 오는 캐리지 리턴을 보내야한다고 생각합니다. –

+1

[ "프로세스의 표준 입력과 표준 출력을 파이프로 리디렉션 할 때주의하십시오.]"(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 죄송합니다. 항상 Win32에는 이러한 것들이 있습니다 :-). – Richard

+1

@ zett42 - 익명 파이프 이것은 명명 된 파이프와 동일합니다. 동일한 객체 (win7에서 시작) 또는 임의의 이름 – RbMm

관련 문제