From 7cac4eb311db157a72edff1968706d92740937ff Mon Sep 17 00:00:00 2001 From: Cristi Fati Date: Mon, 18 Mar 2024 03:56:36 +0200 Subject: [PATCH] Extend PyWin_SetAPIError (#2188) --- win32/src/PyWinTypes.h | 5 ++++- win32/src/PyWinTypesmodule.cpp | 13 +++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/win32/src/PyWinTypes.h b/win32/src/PyWinTypes.h index 6a0d3462a6..b45184cf2e 100644 --- a/win32/src/PyWinTypes.h +++ b/win32/src/PyWinTypes.h @@ -101,7 +101,10 @@ extern PYWINTYPES_EXPORT BOOL PyWin_RegisterErrorMessageModule(DWORD first, DWOR extern PYWINTYPES_EXPORT HINSTANCE PyWin_GetErrorMessageModule(DWORD err); /* A global function that sets an API style error (ie, (code, fn, errTest)) */ -PYWINTYPES_EXPORT PyObject *PyWin_SetAPIError(char *fnName, long err = 0); +PYWINTYPES_EXPORT PyObject *PyWin_SetAPIError(char *fnName, long err = ERROR_SUCCESS); + +// A PyWin_SetAPIError variant that returns None (Py_None) on success. +PYWINTYPES_EXPORT PyObject *PyWin_SetAPIErrorOrReturnNone(char *fnName, long err = ERROR_SUCCESS); /* Basic COM Exception handling. The main COM exception object is actually defined here. However, the most useful functions diff --git a/win32/src/PyWinTypesmodule.cpp b/win32/src/PyWinTypesmodule.cpp index 3dfaefc397..c669501169 100644 --- a/win32/src/PyWinTypesmodule.cpp +++ b/win32/src/PyWinTypesmodule.cpp @@ -275,9 +275,9 @@ HINSTANCE PyWin_GetErrorMessageModule(DWORD err) } /* error helper - GetLastError() is provided, but this is for exceptions */ -PyObject *PyWin_SetAPIError(char *fnName, long err /*= 0*/) +PyObject *PyWin_SetAPIError(char *fnName, long err /*= ERROR_SUCCESS*/) { - DWORD errorCode = err == 0 ? GetLastError() : err; + DWORD errorCode = err == ERROR_SUCCESS ? GetLastError() : err; DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS; // try and find the hmodule providing this error. HMODULE hmodule = PyWin_GetErrorMessageModule(errorCode); @@ -308,6 +308,15 @@ PyObject *PyWin_SetAPIError(char *fnName, long err /*= 0*/) return NULL; } +/* error helper - like PyWin_SetAPIError, but returns None on success */ +PyObject *PyWin_SetAPIErrorOrReturnNone(char *fnName, long err /*= ERROR_SUCCESS*/) +{ + DWORD errorCode = err == ERROR_SUCCESS ? GetLastError() : err; + if (errorCode == ERROR_SUCCESS) + Py_RETURN_NONE; + return PyWin_SetAPIError(fnName, errorCode); +} + // This function sets a basic COM error - it is a valid COM // error, but may not contain rich error text about the error. // Designed to be used before pythoncom has been loaded.