aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--c/common.cpp24
-rw-r--r--c/common.h6
-rw-r--r--c/main.cpp2
3 files changed, 14 insertions, 18 deletions
diff --git a/c/common.cpp b/c/common.cpp
index 7981801..ba52f2c 100644
--- a/c/common.cpp
+++ b/c/common.cpp
@@ -14,36 +14,32 @@ Win32Error::~Win32Error()
HeapFree(GetProcessHeap(), 0, m_wszMsg);
}
-const char* Win32Error::what() const noexcept
+template <>
+const char* Win32Error::what() const noexcept
{
if (!m_szMsg)
FormatMessageA(
FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
m_dwErr,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
(char*)&m_szMsg,
0, NULL);
return m_szMsg;
}
-const TCHAR* Win32Error::twhat() const noexcept
+template <>
+const wchar_t* Win32Error::what() const noexcept
{
-#ifdef UNICODE
-#define M m_wszMsg
-#else
-#define M m_szMsg
-#endif
- if (!M)
- FormatMessage(
+ if (!m_wszMsg)
+ FormatMessageW(
FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
m_dwErr,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (TCHAR*)&M,
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
+ (wchar_t*)&m_wszMsg,
0, NULL);
- return M;
-#undef M
+ return m_wszMsg;
}
/* Library: Wrapper for loading and freeing dynamically linked libraries. */
diff --git a/c/common.h b/c/common.h
index 6b29ed5..d84590d 100644
--- a/c/common.h
+++ b/c/common.h
@@ -17,8 +17,8 @@ struct Win32Error : public std::exception
{
Win32Error(DWORD dwErr);
~Win32Error();
- virtual const char* what() const noexcept override;
- virtual const TCHAR* twhat() const noexcept;
+ template <typename T = char> const T* what() const noexcept;
+
private:
DWORD m_dwErr;
char* m_szMsg = NULL;
@@ -69,7 +69,7 @@ inline auto prefer(T... xs)
try {
return require<F>(xs...);
} catch (Win32Error& e) {
- EBMessageBox(e.twhat(), TEXT("System Error"), MB_ICONWARNING);
+ EBMessageBox(e.what<TCHAR>(), TEXT("System Error"), MB_ICONWARNING);
return (decltype(F(std::declval<T>()...)))NULL;
}
}
diff --git a/c/main.cpp b/c/main.cpp
index a72de53..541f524 100644
--- a/c/main.cpp
+++ b/c/main.cpp
@@ -60,7 +60,7 @@ void OnTerminate() noexcept
"Fatal Error", MB_ICONERROR);
} catch (Win32Error& e) {
std::basic_string<TCHAR> tstr = TEXT("The program was terminated due to a Windows error: ");
- tstr += e.twhat();
+ tstr += e.what<TCHAR>();
MessageBox(NULL, tstr.c_str(), TEXT("Fatal Error"), MB_ICONERROR);
} catch (std::exception& e) {
std::string str = "The program was terminated due to an exception: ";