diff --git a/src/Shmuelie.WinRTServer/NativeMethods.txt b/src/Shmuelie.WinRTServer/NativeMethods.txt index 1aaebe3..a267404 100644 --- a/src/Shmuelie.WinRTServer/NativeMethods.txt +++ b/src/Shmuelie.WinRTServer/NativeMethods.txt @@ -21,4 +21,5 @@ RoInitialize RoRegisterActivationFactories RoRevokeActivationFactories S_FALSE -GLOBALOPT_RO_FLAGS \ No newline at end of file +GLOBALOPT_RO_FLAGS +WindowsGetStringRawBuffer \ No newline at end of file diff --git a/src/Shmuelie.WinRTServer/WinRtServer.cs b/src/Shmuelie.WinRTServer/WinRtServer.cs index 2750332..a45b438 100644 --- a/src/Shmuelie.WinRTServer/WinRtServer.cs +++ b/src/Shmuelie.WinRTServer/WinRtServer.cs @@ -183,7 +183,7 @@ private unsafe HRESULT ActivationFactoryCallback(HSTRING activatableClassId, IAc return HRESULT.E_INVALIDARG; } - if (!factories.TryGetValue(activatableClassId.ToString(), out BaseActivationFactory? managedFactory)) + if (!factories.TryGetValue(activatableClassId.AsString(), out BaseActivationFactory? managedFactory)) { factory = null; return HRESULT.E_NOINTERFACE; diff --git a/src/Shmuelie.WinRTServer/Windows/winrt/HSTRING.cs b/src/Shmuelie.WinRTServer/Windows/winrt/HSTRING.cs new file mode 100644 index 0000000..8aceb19 --- /dev/null +++ b/src/Shmuelie.WinRTServer/Windows/winrt/HSTRING.cs @@ -0,0 +1,24 @@ +using Windows.Win32.Foundation; +using Windows.Win32.System.WinRT; +using static Windows.Win32.PInvoke; + +namespace Shmuelie.Interop.Windows; + +internal static class HSTRING_ +{ +#if !NETSTANDARD + [System.Runtime.Versioning.SupportedOSPlatform("windows8.0")] +#endif + public unsafe static string AsString(this HSTRING @this) + { + if (@this.IsNull) + { + return string.Empty; + } + + uint characterCount; + PCWSTR characters = WindowsGetStringRawBuffer(@this, &characterCount); + + return characters.ToString(); + } +}