1 /** 2 * Windows exceptions. 3 * 4 * License: 5 * This Source Code Form is subject to the terms of 6 * the Mozilla Public License, v. 2.0. If a copy of 7 * the MPL was not distributed with this file, You 8 * can obtain one at http://mozilla.org/MPL/2.0/. 9 * 10 * Authors: 11 * Vladimir Panteleev <vladimir@thecybershadow.net> 12 */ 13 14 module ae.sys.windows.exception; 15 version (Windows): 16 17 import core.sys.windows.windows; 18 19 import std.string; 20 21 import ae.sys.windows.text; 22 23 class WindowsException : Exception 24 { 25 DWORD code; 26 27 this(DWORD code, string str=null) 28 { 29 this.code = code; 30 31 wchar *lpMsgBuf = null; 32 FormatMessageW( 33 FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 34 null, 35 code, 36 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 37 cast(LPWSTR)&lpMsgBuf, 38 0, 39 null); 40 41 auto message = lpMsgBuf.fromWString(); 42 if (lpMsgBuf) 43 LocalFree(lpMsgBuf); 44 45 message = strip(message); 46 message ~= format(" (error %d)", code); 47 if (str) 48 message = str ~ ": " ~ message; 49 50 super(message); 51 } 52 } 53 54 T wenforce(T)(T cond, string str=null) 55 { 56 if (cond) 57 return cond; 58 59 throw new WindowsException(GetLastError(), str); 60 }