Index: runtime/bin/platform_win.cc |
diff --git a/runtime/bin/platform_win.cc b/runtime/bin/platform_win.cc |
index 6ab84246b7e6bb8d14a76d60acfc42cbd6773287..640f99b1b11c840c4ab1186fb917b213ae556222 100644 |
--- a/runtime/bin/platform_win.cc |
+++ b/runtime/bin/platform_win.cc |
@@ -7,6 +7,8 @@ |
#include "bin/platform.h" |
+#include <crtdbg.h> |
+ |
#include "bin/file.h" |
#include "bin/lockers.h" |
#include "bin/log.h" |
@@ -34,6 +36,17 @@ class PlatformWin { |
static void InitOnce() { |
platform_win_mutex_ = new Mutex(); |
saved_output_cp_ = -1; |
+ // Set up a no-op handler so that CRT functions return an error instead of |
+ // hitting an assertion failure. |
+ // See: https://msdn.microsoft.com/en-us/library/a9yf33zb.aspx |
+ _set_invalid_parameter_handler(InvalidParameterHandler); |
+ // Disable the message box for assertions in the CRT in Debug builds. |
+ // See: https://msdn.microsoft.com/en-us/library/1y71x448.aspx |
+ _CrtSetReportMode(_CRT_ASSERT, 0); |
+ // Disable dialog boxes for "critical" errors or when OpenFile cannot find |
+ // the requested file. See: |
+ // See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms680621(v=vs.85).aspx |
+ SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); |
} |
static void SaveAndSetOutputCP() { |
@@ -55,6 +68,15 @@ class PlatformWin { |
static Mutex* platform_win_mutex_; |
static int saved_output_cp_; |
+ static void InvalidParameterHandler(const wchar_t* expression, |
+ const wchar_t* function, |
+ const wchar_t* file, |
+ unsigned int line, |
+ uintptr_t reserved) { |
+ // Doing nothing here means that the CRT call that invoked it will |
+ // return an error code and/or set errno. |
+ } |
+ |
DISALLOW_ALLOCATION(); |
DISALLOW_IMPLICIT_CONSTRUCTORS(PlatformWin); |
}; |
@@ -65,7 +87,6 @@ Mutex* PlatformWin::platform_win_mutex_ = NULL; |
bool Platform::Initialize() { |
PlatformWin::InitOnce(); |
PlatformWin::SaveAndSetOutputCP(); |
- SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); |
return true; |
} |