Skip to content

Commit

Permalink
Minor improvements to 'ExceptionHelpers.SetErrorInfo' (#1824)
Browse files Browse the repository at this point in the history
* Use HSTRING reference

* Skip managed object reference allocation

* Fix HSTRING_HEADER parameter
  • Loading branch information
Sergio0694 authored Oct 22, 2024
1 parent 7c85a8d commit 13ea06c
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 5 deletions.
5 changes: 5 additions & 0 deletions src/WinRT.Runtime/ComWrappersSupport.net5.cs
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,11 @@ public static object TryRegisterObjectForInterface(object obj, IntPtr thisPtr)
return ComWrappers.GetOrRegisterObjectForComInstance(thisPtr, CreateObjectFlags.TrackerObject, obj);
}

internal static IntPtr CreateCCWForObjectUnsafe(object obj)
{
return ComWrappers.GetOrCreateComInterfaceForObject(obj, CreateComInterfaceFlags.TrackerSupport);
}

public static IObjectReference CreateCCWForObject(object obj)
{
IntPtr ccw = ComWrappers.GetOrCreateComInterfaceForObject(obj, CreateComInterfaceFlags.TrackerSupport);
Expand Down
28 changes: 23 additions & 5 deletions src/WinRT.Runtime/ExceptionHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -374,18 +374,36 @@ public static unsafe void SetErrorInfo(Exception ex)
message = ex.GetType().FullName;
}

IntPtr hstring;
MarshalString.HSTRING_HEADER header = default;
IntPtr hstring = default;

fixed (char* lpMessage = message)
{
if (Platform.WindowsCreateString((ushort*)lpMessage, message.Length, &hstring) != 0)
if (Platform.WindowsCreateStringReference(
sourceString: (ushort*)lpMessage,
length: message.Length,
hstring_header: (IntPtr*)&header,
hstring: &hstring) != 0)
{
hstring = IntPtr.Zero;
}
}

using var managedExceptionWrapper = ComWrappersSupport.CreateCCWForObject(ex);
roOriginateLanguageException(GetHRForException(ex), hstring, managedExceptionWrapper.ThisPtr);
#if NET
IntPtr managedExceptionWrapper = ComWrappersSupport.CreateCCWForObjectUnsafe(ex);

try
{
roOriginateLanguageException(GetHRForException(ex), hstring, managedExceptionWrapper);
}
finally
{
Marshal.Release(managedExceptionWrapper);
}
#else
using var managedExceptionWrapper = ComWrappersSupport.CreateCCWForObject(ex);
roOriginateLanguageException(GetHRForException(ex), hstring, managedExceptionWrapper.ThisPtr);
#endif
}
}
}
else
Expand Down

0 comments on commit 13ea06c

Please sign in to comment.