mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-09 20:57:22 +02:00
Fix COM object creation in ExtensionWrapper (#40092)
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? --> ## Summary of the Pull Request Removes extra call to Marshal.GetIUnknownForObject. This method is meant to take a .NET object that implements a COM interface and return a pointer to a COM instance that can be passed to native COM code, but the code was passing a COM instance pointer. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [X] **Closes:** No associated issue - [X] **Communication:** Working with @moooyo on AOT and COM - [X] **Tests:** No change in behavior expected, so no new tests - [X] **Localization:** No new strings - [X] **Dev docs:** No change in behavior - [X] **New binaries:** none
This commit is contained in:
@@ -107,17 +107,17 @@ public class ExtensionWrapper : IExtensionWrapper
|
|||||||
{
|
{
|
||||||
Logger.LogDebug($"Starting {ExtensionDisplayName} ({ExtensionClassId})");
|
Logger.LogDebug($"Starting {ExtensionDisplayName} ({ExtensionClassId})");
|
||||||
|
|
||||||
var extensionPtr = nint.Zero;
|
unsafe
|
||||||
try
|
|
||||||
{
|
{
|
||||||
// -2147024809: E_INVALIDARG
|
var extensionPtr = (void*)nint.Zero;
|
||||||
// -2147467262: E_NOINTERFACE
|
try
|
||||||
// -2147024893: E_PATH_NOT_FOUND
|
|
||||||
var guid = typeof(IExtension).GUID;
|
|
||||||
|
|
||||||
unsafe
|
|
||||||
{
|
{
|
||||||
var hr = PInvoke.CoCreateInstance(Guid.Parse(ExtensionClassId), null, CLSCTX.CLSCTX_LOCAL_SERVER, guid, out var extensionObj);
|
// -2147024809: E_INVALIDARG
|
||||||
|
// -2147467262: E_NOINTERFACE
|
||||||
|
// -2147024893: E_PATH_NOT_FOUND
|
||||||
|
var guid = typeof(IExtension).GUID;
|
||||||
|
|
||||||
|
var hr = PInvoke.CoCreateInstance(Guid.Parse(ExtensionClassId), null, CLSCTX.CLSCTX_LOCAL_SERVER, guid, out extensionPtr);
|
||||||
|
|
||||||
if (hr.Value == -2147024893)
|
if (hr.Value == -2147024893)
|
||||||
{
|
{
|
||||||
@@ -128,28 +128,15 @@ public class ExtensionWrapper : IExtensionWrapper
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
extensionPtr = Marshal.GetIUnknownForObject((nint)extensionObj);
|
Marshal.ThrowExceptionForHR(hr);
|
||||||
if (hr < 0)
|
_extensionObject = MarshalInterface<IExtension>.FromAbi((nint)extensionPtr);
|
||||||
{
|
|
||||||
Logger.LogDebug($"Failed to instantiate {ExtensionDisplayName}: {hr}");
|
|
||||||
Marshal.ThrowExceptionForHR(hr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// extensionPtr = Marshal.GetIUnknownForObject(extensionObj);
|
|
||||||
extensionPtr = (nint)extensionObj;
|
|
||||||
if (hr < 0)
|
|
||||||
{
|
|
||||||
Marshal.ThrowExceptionForHR(hr);
|
|
||||||
}
|
|
||||||
|
|
||||||
_extensionObject = MarshalInterface<IExtension>.FromAbi(extensionPtr);
|
|
||||||
}
|
}
|
||||||
}
|
finally
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (extensionPtr != nint.Zero)
|
|
||||||
{
|
{
|
||||||
Marshal.Release(extensionPtr);
|
if ((nint)extensionPtr != nint.Zero)
|
||||||
|
{
|
||||||
|
Marshal.Release((nint)extensionPtr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user