1 /* 2 * Regedit errors, warnings, informations displaying 3 * 4 * Copyright (C) 2010 Adam Kachwalla <geekdundee@gmail.com> 5 * Copyright (C) 2012 Hermès Bélusca - Maïto <hermes.belusca@sfr.fr> 6 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) 7 */ 8 9 #include "regedit.h" 10 11 int ErrorMessageBox(HWND hWnd, LPCWSTR lpTitle, DWORD dwErrorCode, ...) 12 { 13 int iRet = 0; 14 LPWSTR lpMsgBuf = NULL; 15 DWORD Status = 0; 16 va_list args; 17 18 va_start(args, dwErrorCode); 19 20 Status = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 21 NULL, 22 dwErrorCode, 23 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 24 (LPWSTR)&lpMsgBuf, 25 0, 26 &args); 27 28 va_end(args); 29 30 iRet = MessageBoxW(hWnd, (Status && lpMsgBuf ? lpMsgBuf : L"Error displaying error message."), lpTitle, MB_OK | MB_ICONERROR); 31 32 if (lpMsgBuf) LocalFree(lpMsgBuf); 33 34 /* Return the MessageBoxW information */ 35 return iRet; 36 } 37 38 int InfoMessageBox(HWND hWnd, UINT uType, LPCWSTR lpTitle, LPCWSTR lpMessage, ...) 39 { 40 int iRet = 0; 41 LPWSTR lpMsgBuf = NULL; 42 va_list args; 43 44 va_start(args, lpMessage); 45 46 if (lpMessage) 47 { 48 SIZE_T strLen = _vscwprintf(lpMessage, args); 49 50 /* Create a buffer on the heap and zero it out (LPTR) */ 51 lpMsgBuf = (LPWSTR)LocalAlloc(LPTR, (strLen + 1) * sizeof(WCHAR)); 52 if (lpMsgBuf) 53 { 54 _vsnwprintf(lpMsgBuf, strLen, lpMessage, args); 55 } 56 } 57 58 va_end(args); 59 60 iRet = MessageBoxW(hWnd, (lpMessage && lpMsgBuf ? lpMsgBuf : L"Error displaying info message."), lpTitle, uType); 61 62 if (lpMsgBuf) LocalFree(lpMsgBuf); 63 64 /* Return the MessageBoxW information */ 65 return iRet; 66 } 67