2016-11-04 6 views
0

디버깅을 위해 stdout을 명명 된 파이프로 리디렉션하는 스크립팅 엔진이 있습니다. 아래의 코드는 Visual Studio 6부터 작동하지만 VS2015로 컴파일 할 때 더 이상 작동하지 않습니다. 오류는 발생하지 않지만 출력은 명명 된 파이프 대신 콘솔에 계속 작성됩니다. VS2012에서이 응용 프로그램을 컴파일하면 예상대로 작동합니다.Visual Studio로 컴파일 할 때 콘솔 또는 stdout을 명명 된 파이프로 리디렉션하지 않습니다. 2015

hNamedPipe는 콘솔 텍스트를 리디렉션하려는 파이프입니다.

int hCrt = _open_osfhandle((intptr_t)hNamedPipe, _O_TEXT); 
FILE *hf = _fdopen(hCrt, "w"); 
*stdout = *hf; 
setvbuf(stdout, NULL, _IONBF, 0); 

어떻게 비주얼 C++ V14 플랫폼 도구 세트로 컴파일 할 때 내가 명명 된 파이프에 표준 입출력을 리디렉션 할 수 있는가? 제임스 McNellis에

+0

확실하지,하지만,이 같은 수정'stdout'은 비린내가 보인다, 나는 이전 버전에서 "우연히"일을 가정합니다. –

+0

이것은 ['freopen()'] (https://linux.die.net/man/3/freopen)을 사용해야하는 것과 같습니다. – unwind

+0

"conout $"가 포함 된 freopen()도 사전 시각적 스튜디오 2015에서 작동합니다. – NTDLS

답변

0

덕분에 나는 해결책에 도달 할 수 있었다 :

이것은 의도적으로 설계된 동작입니다. FILE은 (는) 은폐 데이터 형식입니다. 코드에서 수행 한 것처럼 FILE을 참조 해제 할 수 없습니다.

결국 나를 위해 일한 코드입니다 :

void main() 
{ 
    HANDLE hNamedPipe = Create_Some_Named_Pipe(); 

    RedirectIO(stdout, hNamedPipe); 
    printf("Hello World."); //This arrived at the listening named pipe. 
} 

void RedirectIO(FILE *hFrom, HANDLE hTo) 
{ 
    int fd = _open_osfhandle((intptr_t)hTo, _O_WRONLY | _O_TEXT); 
    _dup2(fd, _fileno(hFrom)); 
    setvbuf(hFrom, NULL, _IONBF, 0); //Disable buffering. 
}