Skip to content

Conversation

@ahmed605
Copy link
Contributor

@ahmed605 ahmed605 commented Jul 23, 2025

Updated HRESULT to Exception conversion logic to fall back to system-formatted error messages via the Win32 FormatMessage API when custom error text is not available or is blank. This ensures more consistent and informative exception messages by leveraging Windows' built-in error descriptions.

Example:
image

@ahmed605
Copy link
Contributor Author

@riverar

@manodasanW
Copy link
Member

Thanks for the change, kicked off CI.

@ahmed605
Copy link
Contributor Author

are the CI failures related to the PR? GitHub doesn't allow me to see the details of them

Copy link

@riverar riverar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we get a test for this too? Ideally one that runs RPC_E_WRONG_THREAD through this helper to ensure it spits out the right message.

@riverar
Copy link

riverar commented Jul 24, 2025

Think we should also clean up the commit message on merge (this is not related to WinRT Originate errors) and add a proper PR description here for our future selves looking back at this change.

Perhaps something like:

Updated HRESULT to Exception conversion logic to fall back to system-formatted error messages via the Win32 FormatMessage API when custom error text is not available or is blank. This ensures more consistent and informative exception messages by leveraging Windows' built-in error descriptions.

@manodasanW
Copy link
Member

are the CI failures related to the PR? GitHub doesn't allow me to see the details of them

No, it is unrelated. Have a PR to fix it, after it is merged, you can rebase your changes.

@manodasanW
Copy link
Member

Is there any test that we can add here to confirm we get expected message for a certain HRESULT.

@dongle-the-gadget
Copy link
Contributor

Isn't it enough that we test the ExceptionHelpers class itself? I don't see why we need to wind up WinRT to test it.

In addition, I think we should test if the message is not empty, rather than requiring a string match, because error messages might be localized.

@riverar
Copy link

riverar commented Jul 26, 2025

I'd still check the error message when possible to ensure we're not getting garbage. Can wrap it in a conditional so that non en-US developers don't break. If that's not a concern for this project, I'd delete the en-US check.

[Fact]
public void TestGetExceptionForHR_WithValidHResult_ReturnsSystemFormattedException()
{
    // Arrange
    const int RPC_E_WRONG_THREAD = unchecked((int)0x8001010E);

    // Act
    Exception exception = ExceptionHelpers.GetExceptionForHR(RPC_E_WRONG_THREAD);

    // Assert
    Assert.NotNull(exception);
    Assert.False(string.IsNullOrWhiteSpace(exception.Message));
    if (CultureInfo.CurrentUICulture.Name == "en-US")
    {
        Assert.Equal("The application called an interface that was marshalled for a different thread. (0x8001010E)", exception.Message);
    }
}

I can't test this for you because the build fails despite following the on-boarding instructions.

@ahmed605
Copy link
Contributor Author

I'd still check the error message when possible to ensure we're not getting garbage. Can wrap it in a conditional so that non en-US developers don't break. If that's not a concern for this project, I'd delete the en-US check.

[Fact]
public void TestGetExceptionForHR_WithValidHResult_ReturnsSystemFormattedException()
{
    // Arrange
    const int RPC_E_WRONG_THREAD = unchecked((int)0x8001010E);

    // Act
    Exception exception = ExceptionHelpers.GetExceptionForHR(RPC_E_WRONG_THREAD);

    // Assert
    Assert.NotNull(exception);
    Assert.False(string.IsNullOrWhiteSpace(exception.Message));
    if (CultureInfo.CurrentUICulture.Name == "en-US")
    {
        Assert.Equal("The application called an interface that was marshalled for a different thread. (0x8001010E)", exception.Message);
    }
}

I can't test this for you because the build fails despite following the on-boarding instructions.

added (and tested) this, and I can confirm that building and running the UnitTest project was painful
image

@manodasanW manodasanW merged commit b50e31e into microsoft:master Jul 26, 2025
1 check passed
glennawatson pushed a commit to reactiveui/ReactiveUI that referenced this pull request Dec 14, 2025
…release.251115.2 (#4204)

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[Microsoft.Windows.CsWinRT](https://redirect.github.com/microsoft/cswinrt)
| `2.3.0-prerelease.251015.2` -> `2.3.0-prerelease.251115.2` |
![age](https://developer.mend.io/api/mc/badges/age/nuget/Microsoft.Windows.CsWinRT/2.3.0-prerelease.251115.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Microsoft.Windows.CsWinRT/2.3.0-prerelease.251015.2/2.3.0-prerelease.251115.2?slim=true)
|

---

### Release Notes

<details>
<summary>microsoft/cswinrt (Microsoft.Windows.CsWinRT)</summary>

###
[`v2.3.0-prerelease.251115.2`](https://redirect.github.com/microsoft/CsWinRT/releases/tag/2.3.0-prerelease.251115.2):
CsWinRT 2.3.0-prerelease.251115.2

This is a prerelease version of C#/WinRT with more bug fixes and
improvements.

**C#/WinRT package**:

<https://www.nuget.org/packages/Microsoft.Windows.CsWinRT/2.3.0-prerelease.251115.2>

#### What's Changed

- Fix warning by
[@&#8203;manodasanW](https://redirect.github.com/manodasanW) in
[microsoft/CsWinRT#2023](https://redirect.github.com/microsoft/CsWinRT/pull/2023)
- Use FormatMessage for exception messages in cases where the
stowed/language exception doesn't contain a message by
[@&#8203;ahmed605](https://redirect.github.com/ahmed605) in
[microsoft/CsWinRT#2022](https://redirect.github.com/microsoft/CsWinRT/pull/2022)
- Merge to staging/2.3 by
[@&#8203;manodasanW](https://redirect.github.com/manodasanW) in
[microsoft/CsWinRT#2025](https://redirect.github.com/microsoft/CsWinRT/pull/2025)
- Merge staging/2.3 to master by
[@&#8203;manodasanW](https://redirect.github.com/manodasanW) in
[microsoft/CsWinRT#2030](https://redirect.github.com/microsoft/CsWinRT/pull/2030)
- Fix 'Initialize' typo in several files by
[@&#8203;Lightczx](https://redirect.github.com/Lightczx) in
[microsoft/CsWinRT#2035](https://redirect.github.com/microsoft/CsWinRT/pull/2035)
- Fix design time build error causing incremental build issue by
[@&#8203;manodasanW](https://redirect.github.com/manodasanW) in
[microsoft/CsWinRT#2036](https://redirect.github.com/microsoft/CsWinRT/pull/2036)
- Move TestWinRT repo clone to resource by
[@&#8203;manodasanW](https://redirect.github.com/manodasanW) in
[microsoft/CsWinRT#2032](https://redirect.github.com/microsoft/CsWinRT/pull/2032)
- Fix weak reference rehydration scenarios for non projected types by
[@&#8203;manodasanW](https://redirect.github.com/manodasanW) in
[microsoft/CsWinRT#2043](https://redirect.github.com/microsoft/CsWinRT/pull/2043)
- Add UpToDateCheckBuilt to cover incremental build of Implementation
dlls by [@&#8203;jevansaks](https://redirect.github.com/jevansaks) in
[microsoft/CsWinRT#2051](https://redirect.github.com/microsoft/CsWinRT/pull/2051)
- Fix issue where IReferenceArray is not being found by
[@&#8203;manodasanW](https://redirect.github.com/manodasanW) in
[microsoft/CsWinRT#2071](https://redirect.github.com/microsoft/CsWinRT/pull/2071)
- Fix issue with unsubscribing from events on non-agile objects by
[@&#8203;manodasanW](https://redirect.github.com/manodasanW) in
[microsoft/CsWinRT#2079](https://redirect.github.com/microsoft/CsWinRT/pull/2079)
- Fix issues with CopyToManagedArray by
[@&#8203;manodasanW](https://redirect.github.com/manodasanW) in
[microsoft/CsWinRT#2084](https://redirect.github.com/microsoft/CsWinRT/pull/2084)

#### New Contributors

- [@&#8203;ahmed605](https://redirect.github.com/ahmed605) made their
first contribution in
[microsoft/CsWinRT#2022](https://redirect.github.com/microsoft/CsWinRT/pull/2022)
- [@&#8203;Lightczx](https://redirect.github.com/Lightczx) made their
first contribution in
[microsoft/CsWinRT#2035](https://redirect.github.com/microsoft/CsWinRT/pull/2035)

**Full Changelog**:
<microsoft/CsWinRT@2.3.0-prerelease.250720.1...2.3.0-prerelease.251115.2>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/reactiveui/ReactiveUI).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4xNi4xIiwidXBkYXRlZEluVmVyIjoiNDIuMzIuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiRGVwZW5kZW5jeSBNYW5hZ2VtZW50Il19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants