1 | //////////////////////////////////////////////////////////// |
---|
2 | // Copyright (C) Roman Ryltsov, 2015 |
---|
3 | // Created by Roman Ryltsov roman@alax.info |
---|
4 | // |
---|
5 | // A permission to use the source code is granted as long as reference to |
---|
6 | // source website http://alax.info is retained. |
---|
7 | |
---|
8 | #include "stdafx.h" |
---|
9 | #include <iostream> |
---|
10 | |
---|
11 | CEvent g_TerminationEvent; |
---|
12 | |
---|
13 | BOOL InternalHandlerRoutine(DWORD nType) |
---|
14 | { |
---|
15 | _W(g_TerminationEvent.Set()); |
---|
16 | return TRUE; |
---|
17 | } |
---|
18 | BOOL WINAPI HandlerRoutine(DWORD nType) |
---|
19 | { |
---|
20 | return InternalHandlerRoutine(nType); |
---|
21 | } |
---|
22 | |
---|
23 | int _tmain(int argc, _TCHAR* argv[]) |
---|
24 | { |
---|
25 | // NOTE: generate 2>nul | logstdoutput filename.ext |
---|
26 | _ATLTRY |
---|
27 | { |
---|
28 | if(argc < 2) |
---|
29 | { |
---|
30 | std::cerr << "Syntax: LogStdOutput <path>" << std::endl; |
---|
31 | return 1; |
---|
32 | } |
---|
33 | __E(g_TerminationEvent.Create(NULL, TRUE, FALSE, NULL)); |
---|
34 | __E(SetConsoleCtrlHandler(&HandlerRoutine, TRUE)); |
---|
35 | const HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); |
---|
36 | const HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); |
---|
37 | __D(hInput && hOutput, E_UNNAMED); |
---|
38 | CAtlFile File; |
---|
39 | __C(File.Create(argv[1], GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS)); |
---|
40 | HANDLE phObjects[] = { g_TerminationEvent, hInput }; |
---|
41 | static const SIZE_T g_nDataCapacity = 256 << 10; // 256 KB |
---|
42 | CHeapPtr<BYTE> pnData; |
---|
43 | __D(pnData.Allocate(g_nDataCapacity), E_OUTOFMEMORY); |
---|
44 | for(; ; ) |
---|
45 | { |
---|
46 | const DWORD nWaitResult = WaitForMultipleObjects(DIM(phObjects), phObjects, FALSE, INFINITE); |
---|
47 | _Z5_WAITRESULT(nWaitResult); |
---|
48 | if(nWaitResult != WAIT_OBJECT_0 + 1) // hInput |
---|
49 | break; // Termination? |
---|
50 | DWORD nDataSize = 0; |
---|
51 | __E(ReadFile(hInput, pnData, (DWORD) g_nDataCapacity, &nDataSize, NULL)); |
---|
52 | if(!nDataSize) |
---|
53 | break; |
---|
54 | __E(WriteFile(hOutput, pnData, nDataSize, NULL, NULL)); |
---|
55 | __C(File.Write(pnData, nDataSize)); |
---|
56 | } |
---|
57 | } |
---|
58 | _ATLCATCH(Exception) |
---|
59 | { |
---|
60 | return Exception; |
---|
61 | } |
---|
62 | return 0; |
---|
63 | } |
---|