1 /* 2 * PROJECT: ReactOS Services 3 * LICENSE: GPL - See COPYING in the top level directory 4 * FILE: base/applications/mscutils/servman/misc.c 5 * PURPOSE: miscellaneous functions 6 * COPYRIGHT: Copyright 2005 Thomas Weidenmueller <w3seek@reactos.org> 7 * Copyright 2006 Ged Murphy <gedmurphy@gmail.com> 8 * 9 */ 10 11 #include "precomp.h" 12 13 static INT 14 LengthOfStrResource(IN HINSTANCE hInst, 15 IN UINT uID) 16 { 17 HRSRC hrSrc; 18 HGLOBAL hRes; 19 LPWSTR lpName, lpStr; 20 21 if (hInst == NULL) 22 { 23 return -1; 24 } 25 26 /* There are always blocks of 16 strings */ 27 lpName = (LPWSTR)MAKEINTRESOURCE((uID >> 4) + 1); 28 29 /* Find the string table block */ 30 if ((hrSrc = FindResourceW(hInst, lpName, (LPWSTR)RT_STRING)) && 31 (hRes = LoadResource(hInst, hrSrc)) && 32 (lpStr = (WCHAR*) LockResource(hRes))) 33 { 34 UINT x; 35 36 /* Find the string we're looking for */ 37 uID &= 0xF; /* position in the block, same as % 16 */ 38 for (x = 0; x < uID; x++) 39 { 40 lpStr += (*lpStr) + 1; 41 } 42 43 /* Found the string */ 44 return (int)(*lpStr); 45 } 46 return -1; 47 } 48 49 INT 50 AllocAndLoadString(OUT LPWSTR *lpTarget, 51 IN HINSTANCE hInst, 52 IN UINT uID) 53 { 54 INT ln; 55 56 ln = LengthOfStrResource(hInst, 57 uID); 58 if (ln++ > 0) 59 { 60 (*lpTarget) = (LPWSTR)LocalAlloc(LMEM_FIXED, 61 ln * sizeof(WCHAR)); 62 if ((*lpTarget) != NULL) 63 { 64 INT Ret; 65 if (!(Ret = LoadStringW(hInst, uID, *lpTarget, ln))) 66 { 67 LocalFree((HLOCAL)(*lpTarget)); 68 } 69 return Ret; 70 } 71 } 72 return 0; 73 } 74 75 DWORD 76 LoadAndFormatString(IN HINSTANCE hInstance, 77 IN UINT uID, 78 OUT LPWSTR *lpTarget, 79 ...) 80 { 81 DWORD Ret = 0; 82 LPWSTR lpFormat; 83 va_list lArgs; 84 85 if (AllocAndLoadString(&lpFormat, 86 hInstance, 87 uID) > 0) 88 { 89 va_start(lArgs, lpTarget); 90 /* let's use Format to format it because it has the ability to allocate 91 memory automatically */ 92 Ret = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING, 93 lpFormat, 94 0, 95 0, 96 (LPWSTR)lpTarget, 97 0, 98 &lArgs); 99 va_end(lArgs); 100 101 LocalFree((HLOCAL)lpFormat); 102 } 103 104 return Ret; 105 } 106 107 BOOL 108 StatusBarLoadAndFormatString(IN HWND hStatusBar, 109 IN INT PartId, 110 IN HINSTANCE hInstance, 111 IN UINT uID, 112 ...) 113 { 114 BOOL Ret = FALSE; 115 LPWSTR lpFormat, lpStr; 116 va_list lArgs; 117 118 if (AllocAndLoadString(&lpFormat, 119 hInstance, 120 uID) > 0) 121 { 122 va_start(lArgs, uID); 123 /* let's use FormatMessage to format it because it has the ability to allocate 124 memory automatically */ 125 Ret = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING, 126 lpFormat, 127 0, 128 0, 129 (VOID*)&lpStr, 130 0, 131 &lArgs); 132 va_end(lArgs); 133 134 if (lpStr != NULL) 135 { 136 Ret = (BOOL)SendMessageW(hStatusBar, 137 SB_SETTEXT, 138 (WPARAM)PartId, 139 (LPARAM)lpStr); 140 LocalFree((HLOCAL)lpStr); 141 } 142 143 LocalFree((HLOCAL)lpFormat); 144 } 145 146 return Ret; 147 } 148 149 BOOL 150 StatusBarLoadString(IN HWND hStatusBar, 151 IN INT PartId, 152 IN HINSTANCE hInstance, 153 IN UINT uID) 154 { 155 BOOL Ret = FALSE; 156 LPWSTR lpStr; 157 158 if (AllocAndLoadString(&lpStr, 159 hInstance, 160 uID) > 0) 161 { 162 Ret = (BOOL)SendMessageW(hStatusBar, 163 SB_SETTEXT, 164 (WPARAM)PartId, 165 (LPARAM)lpStr); 166 LocalFree((HLOCAL)lpStr); 167 } 168 169 return Ret; 170 } 171 172 173 INT 174 GetTextFromEdit(OUT LPWSTR lpString, 175 IN HWND hDlg, 176 IN UINT Res) 177 { 178 INT len = GetWindowTextLengthW(GetDlgItem(hDlg, Res)); 179 if(len > 0) 180 { 181 GetDlgItemTextW(hDlg, 182 Res, 183 lpString, 184 len + 1); 185 } 186 else 187 lpString = NULL; 188 189 return len; 190 } 191 192 VOID GetError(VOID) 193 { 194 LPWSTR lpMsgBuf = NULL; 195 196 FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | 197 FORMAT_MESSAGE_FROM_SYSTEM | 198 FORMAT_MESSAGE_IGNORE_INSERTS, 199 NULL, 200 GetLastError(), 201 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 202 (VOID*)&lpMsgBuf, 203 0, 204 NULL ); 205 206 MessageBoxW(NULL, lpMsgBuf, L"Error!", MB_OK | MB_ICONERROR); 207 208 LocalFree(lpMsgBuf); 209 } 210 211 VOID DisplayString(LPWSTR Msg) 212 { 213 MessageBoxW(NULL, Msg, L"Note!", MB_ICONEXCLAMATION|MB_OK); 214 } 215 216 217 218 HIMAGELIST 219 InitImageList(UINT StartResource, 220 UINT EndResource, 221 UINT Width, 222 UINT Height, 223 ULONG type) 224 { 225 HANDLE hImage; 226 HIMAGELIST himl; 227 UINT i; 228 INT ret; 229 230 /* Create the toolbar icon image list */ 231 himl = ImageList_Create(Width, 232 Height, 233 ILC_MASK | ILC_COLOR32, 234 EndResource - StartResource, 235 0); 236 if (himl == NULL) 237 return NULL; 238 239 ret = 0; 240 for (i = StartResource; i <= EndResource && ret != -1; i++) 241 { 242 hImage = LoadImageW(hInstance, 243 MAKEINTRESOURCEW(i), 244 type, 245 Width, 246 Height, 247 LR_LOADTRANSPARENT); 248 if (hImage == NULL) 249 { 250 ImageList_Destroy(himl); 251 himl = NULL; 252 break; 253 } 254 255 if (type == IMAGE_BITMAP) 256 { 257 ret = ImageList_AddMasked(himl, 258 hImage, 259 RGB(255, 0, 128)); 260 } 261 else if (type == IMAGE_ICON) 262 { 263 ret = ImageList_AddIcon(himl, 264 hImage); 265 } 266 267 DeleteObject(hImage); 268 } 269 270 if (ret == -1) 271 { 272 ImageList_Destroy(himl); 273 himl = NULL; 274 } 275 276 return himl; 277 } 278 279 280 #define BUFFERSIZE 512 281 282 VOID 283 ResourceMessageBox( 284 HINSTANCE hInstance, 285 HWND hwnd, 286 UINT uType, 287 UINT uCaptionId, 288 UINT uMessageId) 289 { 290 WCHAR szErrorText[BUFFERSIZE]; 291 WCHAR szErrorCaption[BUFFERSIZE]; 292 293 LoadStringW(hInstance, uMessageId, szErrorText, sizeof(szErrorText) / sizeof(WCHAR)); 294 LoadStringW(hInstance, uCaptionId, szErrorCaption, sizeof(szErrorCaption) / sizeof(WCHAR)); 295 296 MessageBoxW(hwnd, szErrorText, szErrorCaption, uType); 297 } 298 299