Fixed windows/init.c to properly report HRESULT error codes.

This commit is contained in:
Pietro Gagliardi 2015-06-02 12:31:47 -04:00
parent cf05629175
commit 680c9face7
1 changed files with 15 additions and 8 deletions

View File

@ -13,11 +13,10 @@ struct uiInitError {
char failbuf[256];
};
#define initErrorFormat L"error %s: %s%sGetLastError() == %I32u%s"
#define initErrorArgs wmessage, sysmsg, beforele, le, afterle
#define initErrorFormat L"error %s: %s%s%s %I32u (0x%I32X)%s"
#define initErrorArgs wmessage, sysmsg, beforele, label, value, value, afterle
// TODO split for HRESULTs
static const char *loadLastError(const char *message)
static const char *initerr(const char *message, const WCHAR *label, DWORD value)
{
WCHAR *sysmsg;
BOOL hassysmsg;
@ -27,10 +26,8 @@ static const char *loadLastError(const char *message)
WCHAR *wmessage;
WCHAR *wstr;
const char *str;
DWORD le;
le = GetLastError();
if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, le, 0, (LPWSTR) (&sysmsg), 0, NULL) != 0) {
if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, value, 0, (LPWSTR) (&sysmsg), 0, NULL) != 0) {
hassysmsg = TRUE;
beforele = L" (";
afterle = L")";
@ -53,6 +50,16 @@ static const char *loadLastError(const char *message)
return str;
}
static const char *loadLastError(const char *message)
{
return initerr(message, L"GetLastError() ==", GetLastError());
}
static const char *loadHRESULT(const char *message, HRESULT hr)
{
return initerr(message, L"HRESULT", (DWORD) hr);
}
static BOOL WINAPI consoleCtrlHandler(DWORD dwCtrlType)
{
switch (dwCtrlType) {
@ -148,7 +155,7 @@ const char *uiInit(uiInitOptions *o)
hr = CoInitialize(NULL);
if (hr != S_OK && hr != S_FALSE)
return loadLastError("initializing COM"); // TODO loadHRESULT
return loadHRESULT("initializing COM", hr);
// TODO initialize COM security
// TODO (windows vista) turn off COM exception handling