Something went wrong. Try again.
Reactos
Something went wrong. Try again.
2.8 kB · 114 lines
C
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115/* * PROJECT: ReactOS VGA Font Editor * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) * PURPOSE: Some miscellaneous resource functions * COPYRIGHT: Copyright 2006-2007 Thomas Weidenmueller (thomas@reactsoft.com) * Copyright 2008 Colin Finck (colin@reactos.org) */
#include "precomp.h"
static INTLengthOfStrResource(IN UINT uID){ HRSRC hrSrc; HGLOBAL hRes; LPWSTR lpName, lpStr;
/* There are always blocks of 16 strings */ lpName = (LPWSTR)MAKEINTRESOURCEW((uID >> 4) + 1);
/* Find the string table block */ if ((hrSrc = FindResourceW(hInstance, lpName, (LPWSTR)RT_STRING)) && (hRes = LoadResource(hInstance, hrSrc)) && (lpStr = LockResource(hRes))) { UINT x;
/* Find the string we're looking for */ uID &= 0xF; /* position in the block, same as % 16 */ for (x = 0; x < uID; x++) { lpStr += (*lpStr) + 1; }
/* Found the string */ return (int)(*lpStr); } return -1;}
intAllocAndLoadString(OUT LPWSTR *lpTarget, IN UINT uID){ INT ln;
ln = LengthOfStrResource(uID); if (ln++ > 0) { (*lpTarget) = (LPWSTR)LocalAlloc(LMEM_FIXED, ln * sizeof(WCHAR)); if ((*lpTarget) != NULL) { INT Ret; if (!(Ret = LoadStringW(hInstance, uID, *lpTarget, ln))) { LocalFree((HLOCAL)(*lpTarget)); } return Ret; } } return 0;}
static DWORDVarListLoadAndFormatString(IN UINT uID, OUT PWSTR *lpTarget, IN va_list* Args){ DWORD Ret = 0; PWSTR lpFormat;
if (AllocAndLoadString(&lpFormat, uID) > 0) { /* let's use FormatMessage to format it because it has the ability to allocate memory automatically */ Ret = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING, lpFormat, 0, 0, (LPWSTR)lpTarget, 0, Args);
HeapFree(hProcessHeap, 0, lpFormat); }
return Ret;}
DWORDLoadAndFormatString(IN UINT uID, OUT PWSTR *lpTarget, ...){ DWORD Ret; va_list Args;
va_start(Args, lpTarget); Ret = VarListLoadAndFormatString(uID, lpTarget, &Args); va_end(Args);
return Ret;}
VOIDLocalizedError(IN UINT uID, ...){ PWSTR pszError; va_list Args;
va_start(Args, uID); VarListLoadAndFormatString(uID, &pszError, &Args); va_end(Args);
MessageBoxW(NULL, pszError, szAppName, MB_ICONERROR); HeapFree(hProcessHeap, 0, pszError);}