Windows logging: Fix check for console applications.
The old code used to check for usingWinMain, which is not set when Qt is used within a DLL. Try to check for presence of stderr by checking for a console window or a redirected stderr-handle. Task-number: QTBUG-32044 Change-Id: I87893c3438f5e92d73488e9c25b95cbfeaacc1f6 Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
This commit is contained in:
parent
e5734c2f08
commit
7fb3906d4e
@ -84,6 +84,33 @@ static bool isFatal(QtMsgType msgType)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
|
||||||
|
// Do we have stderr for QDebug? - Either there is a console or we are running
|
||||||
|
// with redirected stderr.
|
||||||
|
# ifndef Q_OS_WINCE
|
||||||
|
static inline bool hasStdErr()
|
||||||
|
{
|
||||||
|
if (GetConsoleWindow())
|
||||||
|
return true;
|
||||||
|
STARTUPINFO info;
|
||||||
|
GetStartupInfo(&info);
|
||||||
|
return (info.dwFlags & STARTF_USESTDHANDLES) && info.hStdError
|
||||||
|
&& info.hStdError != INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
# endif // !Q_OS_WINCE
|
||||||
|
|
||||||
|
bool qWinLogToStderr()
|
||||||
|
{
|
||||||
|
# ifndef Q_OS_WINCE
|
||||||
|
static const bool result = hasStdErr();
|
||||||
|
return result;
|
||||||
|
# else
|
||||||
|
return false;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
#endif // Q_OS_WIN
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\class QMessageLogContext
|
\class QMessageLogContext
|
||||||
\inmodule QtCore
|
\inmodule QtCore
|
||||||
@ -114,11 +141,6 @@ static bool isFatal(QtMsgType msgType)
|
|||||||
\sa QMessageLogContext, qDebug(), qWarning(), qCritical(), qFatal()
|
\sa QMessageLogContext, qDebug(), qWarning(), qCritical(), qFatal()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
|
|
||||||
// defined in qcoreapplication_win.cpp
|
|
||||||
extern bool usingWinMain;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
static inline void convert_to_wchar_t_elided(wchar_t *d, size_t space, const char *s) Q_DECL_NOEXCEPT
|
static inline void convert_to_wchar_t_elided(wchar_t *d, size_t space, const char *s) Q_DECL_NOEXCEPT
|
||||||
{
|
{
|
||||||
@ -159,11 +181,11 @@ static void qEmergencyOut(QtMsgType msgType, const char *msg, va_list ap) Q_DECL
|
|||||||
convert_to_wchar_t_elided(emergency_bufL, sizeof emergency_buf, emergency_buf);
|
convert_to_wchar_t_elided(emergency_bufL, sizeof emergency_buf, emergency_buf);
|
||||||
OutputDebugStringW(emergency_bufL);
|
OutputDebugStringW(emergency_bufL);
|
||||||
# else
|
# else
|
||||||
if (usingWinMain) {
|
if (qWinLogToStderr()) {
|
||||||
OutputDebugStringA(emergency_buf);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "%s", emergency_buf);
|
fprintf(stderr, "%s", emergency_buf);
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
|
} else {
|
||||||
|
OutputDebugStringA(emergency_buf);
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
@ -683,7 +705,7 @@ void QMessagePattern::setPattern(const QString &pattern)
|
|||||||
OutputDebugString(reinterpret_cast<const wchar_t*>(error.utf16()));
|
OutputDebugString(reinterpret_cast<const wchar_t*>(error.utf16()));
|
||||||
if (0)
|
if (0)
|
||||||
#elif defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
|
#elif defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
|
||||||
if (usingWinMain) {
|
if (!qWinLogToStderr()) {
|
||||||
OutputDebugString(reinterpret_cast<const wchar_t*>(error.utf16()));
|
OutputDebugString(reinterpret_cast<const wchar_t*>(error.utf16()));
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
@ -865,10 +887,7 @@ static void qDefaultMessageHandler(QtMsgType type, const QMessageLogContext &con
|
|||||||
QString logMessage = qMessageFormatString(type, context, buf);
|
QString logMessage = qMessageFormatString(type, context, buf);
|
||||||
|
|
||||||
#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
|
#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
|
||||||
#if !defined(Q_OS_WINCE)
|
if (!qWinLogToStderr()) {
|
||||||
if (usingWinMain)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
OutputDebugString(reinterpret_cast<const wchar_t *>(logMessage.utf16()));
|
OutputDebugString(reinterpret_cast<const wchar_t *>(logMessage.utf16()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,6 @@
|
|||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
bool usingWinMain = false; // whether the qWinMain() is used or not
|
|
||||||
int appCmdShow = 0;
|
int appCmdShow = 0;
|
||||||
|
|
||||||
Q_CORE_EXPORT HINSTANCE qWinAppInst() // get Windows app handle
|
Q_CORE_EXPORT HINSTANCE qWinAppInst() // get Windows app handle
|
||||||
@ -147,7 +146,6 @@ void qWinMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR cmdParam,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
already_called = true;
|
already_called = true;
|
||||||
usingWinMain = true;
|
|
||||||
|
|
||||||
// Create command line
|
// Create command line
|
||||||
argv = qWinCmdLine<char>(cmdParam, int(strlen(cmdParam)), argc);
|
argv = qWinCmdLine<char>(cmdParam, int(strlen(cmdParam)), argc);
|
||||||
|
Loading…
Reference in New Issue
Block a user