added method to activate stdout/stderr for GUI app on Windows
This commit is contained in:
parent
5689cb8058
commit
79faa46da0
|
@ -1,4 +1,5 @@
|
||||||
#include "argumentparser.h"
|
#include "argumentparser.h"
|
||||||
|
#include "commandlineutils.h"
|
||||||
#include "failure.h"
|
#include "failure.h"
|
||||||
|
|
||||||
#include "../conversion/stringconversion.h"
|
#include "../conversion/stringconversion.h"
|
||||||
|
@ -652,7 +653,10 @@ void ArgumentParser::parseArgs(int argc, char *argv[])
|
||||||
HelpArgument::HelpArgument(ArgumentParser &parser) :
|
HelpArgument::HelpArgument(ArgumentParser &parser) :
|
||||||
Argument("help", "h", "shows this information")
|
Argument("help", "h", "shows this information")
|
||||||
{
|
{
|
||||||
setCallback([&parser] (const StringVector &) {parser.printHelp(cout);});
|
setCallback([&parser] (const StringVector &) {
|
||||||
|
CMD_UTILS_START_CONSOLE;
|
||||||
|
parser.printHelp(cout);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,10 +3,18 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#ifdef PLATFORM_WINDOWS
|
||||||
|
#include <windows.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
namespace ApplicationUtilities {
|
namespace ApplicationUtilities {
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Prompts for confirmation displaying the specified \a message.
|
||||||
|
*/
|
||||||
bool confirmPrompt(const char *message, Response defaultResponse)
|
bool confirmPrompt(const char *message, Response defaultResponse)
|
||||||
{
|
{
|
||||||
cout << message;
|
cout << message;
|
||||||
|
@ -28,5 +36,39 @@ bool confirmPrompt(const char *message, Response defaultResponse)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ApplicationUtilities
|
/*!
|
||||||
|
* \brief Starts the console.
|
||||||
|
* \remarks This method is only available on Windows and used to start
|
||||||
|
* a console from a GUI application.
|
||||||
|
*/
|
||||||
|
void startConsole()
|
||||||
|
{
|
||||||
|
AttachConsole(ATTACH_PARENT_PROCESS);
|
||||||
|
CONSOLE_SCREEN_BUFFER_INFO coninfo;
|
||||||
|
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
|
||||||
|
coninfo.dwSize.X = 200;
|
||||||
|
coninfo.dwSize.Y = 500;
|
||||||
|
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
|
||||||
|
// redirect stdout
|
||||||
|
auto stdHandle = reinterpret_cast<intptr_t>(GetStdHandle(STD_OUTPUT_HANDLE));
|
||||||
|
auto conHandle = _open_osfhandle(stdHandle, _O_TEXT);
|
||||||
|
auto fp = _fdopen(conHandle, "w");
|
||||||
|
*stdout = *fp;
|
||||||
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
|
// redirect stdin
|
||||||
|
stdHandle = reinterpret_cast<intptr_t>(GetStdHandle(STD_INPUT_HANDLE));
|
||||||
|
conHandle = _open_osfhandle(stdHandle, _O_TEXT);
|
||||||
|
fp = _fdopen(conHandle, "r");
|
||||||
|
*stdin = *fp;
|
||||||
|
setvbuf(stdin, NULL, _IONBF, 0);
|
||||||
|
// redirect stderr
|
||||||
|
stdHandle = reinterpret_cast<intptr_t>(GetStdHandle(STD_ERROR_HANDLE));
|
||||||
|
conHandle = _open_osfhandle(stdHandle, _O_TEXT);
|
||||||
|
fp = _fdopen(conHandle, "w");
|
||||||
|
*stderr = *fp;
|
||||||
|
setvbuf(stderr, NULL, _IONBF, 0);
|
||||||
|
// sync
|
||||||
|
ios::sync_with_stdio(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace ApplicationUtilities
|
||||||
|
|
|
@ -14,6 +14,13 @@ enum class Response
|
||||||
|
|
||||||
bool LIB_EXPORT confirmPrompt(const char *message, Response defaultResponse = Response::None);
|
bool LIB_EXPORT confirmPrompt(const char *message, Response defaultResponse = Response::None);
|
||||||
|
|
||||||
|
#ifdef PLATFORM_WINDOWS
|
||||||
|
void LIB_EXPORT startConsole();
|
||||||
|
#define CMD_UTILS_START_CONSOLE ::ApplicationUtilities::startConsole();
|
||||||
|
#else
|
||||||
|
#define CMD_UTILS_START_CONSOLE
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace ApplicationUtilities
|
} // namespace ApplicationUtilities
|
||||||
|
|
||||||
#endif // APPLICATIONUTILITIES_COMMANDLINEUTILS_H
|
#endif // APPLICATIONUTILITIES_COMMANDLINEUTILS_H
|
||||||
|
|
Loading…
Reference in New Issue