[MSUTB][SDK] Use QISearch for QueryInterface (#6631)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Sun, 17 Mar 2024 02:55:19 +0000 (11:55 +0900)
committerGitHub <noreply@github.com>
Sun, 17 Mar 2024 02:55:19 +0000 (11:55 +0900)
Simplify code and reduce binary size.
JIRA issue: CORE-19363
- Use shlwapi!QISearch for QueryInterface
  implementation.
- Add delay link to shlwapi.
- Define QITABENT macro in <shlwapi.h>.

dll/win32/msutb/CMakeLists.txt
dll/win32/msutb/msutb.cpp
sdk/include/psdk/shlwapi.h

index c63dbb1..df52342 100644 (file)
@@ -15,5 +15,5 @@ set_module_type(msutb win32dll UNICODE)
 add_dependencies(msutb msctf psdk)
 target_link_libraries(msutb wine uuid atl_classes cicero)
 add_importlibs(msutb user32 gdi32 advapi32 msvcrt kernel32 ntdll)
-add_delay_importlibs(msutb uxtheme imm32 comctl32 msctf ole32 oleacc oleaut32 shell32)
+add_delay_importlibs(msutb uxtheme imm32 shlwapi comctl32 msctf ole32 oleacc oleaut32 shell32)
 add_cd_file(TARGET msutb DESTINATION reactos/system32 FOR all)
index b81e2e2..4f307c3 100644 (file)
@@ -1887,13 +1887,12 @@ CCicLibMenu::~CCicLibMenu()
 
 STDMETHODIMP CCicLibMenu::QueryInterface(REFIID riid, LPVOID *ppvObj)
 {
-    if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfMenu))
+    static const QITAB c_tab[] =
     {
-        *ppvObj = this;
-        AddRef();
-        return S_OK;
-    }
-    return E_NOINTERFACE;
+        QITABENT(CCicLibMenu, ITfMenu),
+        { NULL }
+    };
+    return ::QISearch(this, c_tab, riid, ppvObj);
 }
 
 STDMETHODIMP_(ULONG) CCicLibMenu::AddRef()
@@ -2191,15 +2190,13 @@ STDMETHODIMP CTipbarAccessible::QueryInterface(
     REFIID riid,
     void **ppvObject)
 {
-    if (IsEqualIID(riid, IID_IUnknown) ||
-        IsEqualIID(riid, IID_IDispatch) ||
-        IsEqualIID(riid, IID_IAccessible))
+    static const QITAB c_tab[] =
     {
-        *ppvObject = this;
-        AddRef();
-        return S_OK;
-    }
-    return E_NOINTERFACE;
+        QITABENT(CTipbarAccessible, IDispatch),
+        QITABENT(CTipbarAccessible, IAccessible),
+        { NULL }
+    };
+    return ::QISearch(this, c_tab, riid, ppvObject);
 }
 
 STDMETHODIMP_(ULONG) CTipbarAccessible::AddRef()
@@ -3667,25 +3664,14 @@ CLBarItemButtonBase::~CLBarItemButtonBase()
 
 STDMETHODIMP CLBarItemButtonBase::QueryInterface(REFIID riid, void **ppvObject)
 {
-    if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfLangBarItem))
+    static const QITAB c_tab[] =
     {
-        *ppvObject = static_cast<ITfLangBarItem*>(this);
-        AddRef();
-        return S_OK;
-    }
-    if (IsEqualIID(riid, IID_ITfLangBarItemButton))
-    {
-        *ppvObject = static_cast<ITfLangBarItemButton*>(this);
-        AddRef();
-        return S_OK;
-    }
-    if (IsEqualIID(riid, IID_ITfSource))
-    {
-        *ppvObject = static_cast<ITfSource*>(this);
-        AddRef();
-        return S_OK;
-    }
-    return E_NOINTERFACE;
+        QITABENT(CLBarItemButtonBase, ITfLangBarItem),
+        QITABENT(CLBarItemButtonBase, ITfLangBarItemButton),
+        QITABENT(CLBarItemButtonBase, ITfSource),
+        { NULL }
+    };
+    return ::QISearch(this, c_tab, riid, ppvObject);
 }
 
 STDMETHODIMP_(ULONG) CLBarItemButtonBase::AddRef()
@@ -5148,19 +5134,13 @@ void CTipbarWnd::TerminateAllThreads(BOOL bFlag)
 
 STDMETHODIMP CTipbarWnd::QueryInterface(REFIID riid, void **ppvObj)
 {
-    if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfLangBarEventSink))
-    {
-        *ppvObj = this;
-        AddRef();
-        return S_OK;
-    }
-    if (IsEqualIID(riid, IID_ITfLangBarEventSink_P))
+    static const QITAB c_tab[] =
     {
-        *ppvObj = static_cast<ITfLangBarEventSink_P*>(this);
-        AddRef();
-        return S_OK;
-    }
-    return E_NOINTERFACE;
+        QITABENT(CTipbarWnd, ITfLangBarEventSink),
+        QITABENT(CTipbarWnd, ITfLangBarEventSink_P),
+        { NULL }
+    };
+    return ::QISearch(this, c_tab, riid, ppvObj);
 }
 
 STDMETHODIMP_(ULONG) CTipbarWnd::AddRef()
index 801928f..84b95db 100644 (file)
@@ -2090,6 +2090,9 @@ QISearch(
 #define OFFSETOFCLASS(base, derived) \
     ((DWORD)(DWORD_PTR)(static_cast<base*>((derived*)8))-8)
 
+#define QITABENTMULTI(Cthis, Ifoo, Iimpl) { &IID_##Ifoo, OFFSETOFCLASS(Iimpl, Cthis) }
+#define QITABENT(Cthis, Ifoo) QITABENTMULTI(Cthis, Ifoo, Ifoo)
+
 #include <poppack.h>
 
 #ifdef __cplusplus