From 46153a04087d1bef8f2ef3da3cb14e1b97bf4a6c Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Thu, 16 Jan 2025 12:02:27 +0100 Subject: [PATCH] DWrite/GeometryRecorder: Complete implementation of QueryInterface ...by checking for IUnknown. This makes GeometryRecorder::QueryInterface compliant with the rules of COM. QueryInterface for IUnknown has a special meaning in COM: it's used to check whether two interface pointers refer to the same object. --- src/win32/cairo-dwrite-font.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/win32/cairo-dwrite-font.cpp b/src/win32/cairo-dwrite-font.cpp index 36d6b5c7b..a69adec0b 100644 --- a/src/win32/cairo-dwrite-font.cpp +++ b/src/win32/cairo-dwrite-font.cpp @@ -845,15 +845,18 @@ public: : mCairoPath(aCairoPath) , mMatrix(matrix) {} - // IUnknown interface IFACEMETHOD (QueryInterface)(IID const& iid, OUT void** ppObject) noexcept override { - if (iid != __uuidof(IDWriteGeometrySink)) - return E_NOINTERFACE; + if (iid == __uuidof (IUnknown) || + iid == __uuidof (IDWriteGeometrySink)) + { + AddRef(); + *ppObject = this; + return S_OK; + } - *ppObject = static_cast(this); - - return S_OK; + *ppObject = nullptr; + return E_NOINTERFACE; } IFACEMETHOD_(ULONG, AddRef)() noexcept override