For React Native. These help detect errors for React Native applications.
-- v2: combase: Add an error message when class is not found. combase: Add RoReportUnhandledError() stub. combase: Add RoGetErrorReportingFlags() stub. combase: Add RoFailFastWithErrorContextInternal2() stub.
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/combase/combase.spec | 2 +- dlls/combase/roapi.c | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec index 80d0ee167e9..fb5d673db47 100644 --- a/dlls/combase/combase.spec +++ b/dlls/combase/combase.spec @@ -59,7 +59,7 @@ @ stub NdrProxyForwardingFunction31 @ stub NdrProxyForwardingFunction32 @ stub NdrOleInitializeExtension -@ stub RoFailFastWithErrorContextInternal2 +@ stdcall RoFailFastWithErrorContextInternal2(long long ptr) @ stub RoFailFastWithErrorContextInternal @ stub UpdateProcessTracing @ stdcall CLIPFORMAT_UserFree(ptr ptr) diff --git a/dlls/combase/roapi.c b/dlls/combase/roapi.c index 0a7129c6c58..44df8590a45 100644 --- a/dlls/combase/roapi.c +++ b/dlls/combase/roapi.c @@ -16,6 +16,8 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "ntstatus.h" +#define WIN32_NO_STATUS #define COBJMACROS #include "objbase.h" #include "initguid.h" @@ -415,6 +417,15 @@ HRESULT WINAPI RoGetAgileReference(enum AgileReferenceOptions option, REFIID rii return S_OK; }
+/*********************************************************************** + * RoFailFastWithErrorContextInternal2 (combase.@) + */ +void WINAPI RoFailFastWithErrorContextInternal2(HRESULT error, ULONG exception_count, /* PSTOWED_EXCEPTION_INFORMATION_V2 */void *information) +{ + FIXME("%#lx, %lu, %p stub.\n", error, exception_count, information); + TerminateProcess(GetCurrentProcess(), STATUS_FAIL_FAST_EXCEPTION); +} + /*********************************************************************** * RoGetApartmentIdentifier (combase.@) */
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/combase/combase.spec | 2 +- dlls/combase/roapi.c | 15 +++++++++++++++ dlls/combase/tests/roapi.c | 15 +++++++++++++++ include/roerrorapi.h | 1 + 4 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec index fb5d673db47..73c3e7ec8ef 100644 --- a/dlls/combase/combase.spec +++ b/dlls/combase/combase.spec @@ -294,7 +294,7 @@ @ stdcall RoGetActivationFactory(ptr ptr ptr) @ stdcall RoGetAgileReference(long ptr ptr ptr) @ stdcall RoGetApartmentIdentifier(ptr) -@ stub RoGetErrorReportingFlags +@ stdcall RoGetErrorReportingFlags(ptr) @ stub RoGetMatchingRestrictedErrorInfo @ stdcall RoGetParameterizedTypeInstanceIID(long ptr ptr ptr ptr) @ stdcall RoGetServerActivatableClasses(ptr ptr ptr) diff --git a/dlls/combase/roapi.c b/dlls/combase/roapi.c index 44df8590a45..ef3d61c71d6 100644 --- a/dlls/combase/roapi.c +++ b/dlls/combase/roapi.c @@ -536,6 +536,21 @@ HRESULT WINAPI RoSetErrorReportingFlags(UINT32 flags) return S_OK; }
+/*********************************************************************** + * RoGetErrorReportingFlags (combase.@) + */ +HRESULT WINAPI RoGetErrorReportingFlags(UINT32 *flags) +{ + FIXME("(%p): stub\n", flags); + + if (!flags) + return E_POINTER; + + *flags = RO_ERROR_REPORTING_USESETERRORINFO; + return S_OK; +} + + /*********************************************************************** * CleanupTlsOleState (combase.@) */ diff --git a/dlls/combase/tests/roapi.c b/dlls/combase/tests/roapi.c index 7606c61c165..ab5dbff6017 100644 --- a/dlls/combase/tests/roapi.c +++ b/dlls/combase/tests/roapi.c @@ -25,6 +25,7 @@
#include "initguid.h" #include "roapi.h" +#include "roerrorapi.h"
#include "wine/test.h"
@@ -537,6 +538,19 @@ static void test_RoGetAgileReference(void) } }
+static void test_RoGetErrorReportingFlags(void) +{ + UINT32 flags; + HRESULT hr; + + hr = RoGetErrorReportingFlags(NULL); + ok(hr == E_POINTER, "Got unexpected hr %#lx.\n", hr); + + hr = RoGetErrorReportingFlags(&flags); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ok(flags == RO_ERROR_REPORTING_USESETERRORINFO, "Got unexpected flag %#x.\n", flags); +} + START_TEST(roapi) { BOOL ret; @@ -546,6 +560,7 @@ START_TEST(roapi) test_implicit_mta(); test_ActivationFactories(); test_RoGetAgileReference(); + test_RoGetErrorReportingFlags();
SetLastError(0xdeadbeef); ret = DeleteFileW(L"wine.combase.test.dll"); diff --git a/include/roerrorapi.h b/include/roerrorapi.h index 4831e3afe40..ec02448e496 100644 --- a/include/roerrorapi.h +++ b/include/roerrorapi.h @@ -33,6 +33,7 @@ typedef enum } RO_ERROR_REPORTING_FLAGS;
HRESULT WINAPI GetRestrictedErrorInfo(IRestrictedErrorInfo **info); +HRESULT WINAPI RoGetErrorReportingFlags(UINT32 *flags); BOOL WINAPI RoOriginateError(HRESULT error, HSTRING message); BOOL WINAPI RoOriginateErrorW(HRESULT error, UINT max_len, const WCHAR *message); BOOL WINAPI RoOriginateLanguageException(HRESULT error, HSTRING message, IUnknown *language_exception);
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/combase/combase.spec | 2 +- dlls/combase/roapi.c | 9 +++++++++ include/roerrorapi.h | 1 + 3 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec index 73c3e7ec8ef..7e2d34447a3 100644 --- a/dlls/combase/combase.spec +++ b/dlls/combase/combase.spec @@ -309,7 +309,7 @@ @ stdcall RoRegisterForApartmentShutdown(ptr ptr ptr) @ stub RoReportCapabilityCheckFailure @ stub RoReportFailedDelegate -@ stub RoReportUnhandledError +@ stdcall RoReportUnhandledError(ptr) @ stub RoResolveRestrictedErrorInfoReference @ stub RoRevokeActivationFactories @ stdcall RoSetErrorReportingFlags(long) diff --git a/dlls/combase/roapi.c b/dlls/combase/roapi.c index ef3d61c71d6..ca45883f5d2 100644 --- a/dlls/combase/roapi.c +++ b/dlls/combase/roapi.c @@ -527,6 +527,15 @@ BOOL WINAPI RoOriginateErrorW(HRESULT error, UINT max_len, const WCHAR *message) return FALSE; }
+/*********************************************************************** + * RoReportUnhandledError (combase.@) + */ +HRESULT WINAPI RoReportUnhandledError(IRestrictedErrorInfo *info) +{ + FIXME("(%p): stub\n", info); + return S_OK; +} + /*********************************************************************** * RoSetErrorReportingFlags (combase.@) */ diff --git a/include/roerrorapi.h b/include/roerrorapi.h index ec02448e496..8f3200c559d 100644 --- a/include/roerrorapi.h +++ b/include/roerrorapi.h @@ -37,6 +37,7 @@ HRESULT WINAPI RoGetErrorReportingFlags(UINT32 *flags); BOOL WINAPI RoOriginateError(HRESULT error, HSTRING message); BOOL WINAPI RoOriginateErrorW(HRESULT error, UINT max_len, const WCHAR *message); BOOL WINAPI RoOriginateLanguageException(HRESULT error, HSTRING message, IUnknown *language_exception); +HRESULT WINAPI RoReportUnhandledError(IRestrictedErrorInfo *info); HRESULT WINAPI RoSetErrorReportingFlags(UINT32 flags); HRESULT WINAPI SetRestrictedErrorInfo(IRestrictedErrorInfo *info);
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/combase/roapi.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/dlls/combase/roapi.c b/dlls/combase/roapi.c index ca45883f5d2..73af24d55ac 100644 --- a/dlls/combase/roapi.c +++ b/dlls/combase/roapi.c @@ -195,6 +195,10 @@ HRESULT WINAPI DECLSPEC_HOTPATCH RoGetActivationFactory(HSTRING classid, REFIID } IActivationFactory_Release(factory); } + else + { + ERR("Class %s not found in %s, hr %#lx.\n", wine_dbgstr_hstring(classid), debugstr_w(library), hr); + }
done: free(library);
On Mon Jun 9 15:31:20 2025 +0000, Jinoh Kang wrote:
I didn't notice the approval, sorry. The MSDN does stat this is a noreturn though. Let's just hope that the app doesn't go haywire after a failfast.
Thanks. I've added "TerminateProcess(GetCurrentProcess(), STATUS_FAIL_FAST_EXCEPTION);" to `RoFailFastWithErrorContextInternal2`.
On Tue Jun 10 09:30:04 2025 +0000, Zhiyi Zhang wrote:
Thanks. I've added "TerminateProcess(GetCurrentProcess(), STATUS_FAIL_FAST_EXCEPTION);" to `RoFailFastWithErrorContextInternal2`.
The docs say that this ends up calling `RaiseFailFastException` which would probably be a better choice (currently it does the same thing, but at some point it should raise a proper exception).