[PATCH] Use public define for QISearch table entry, make it available by name (as on Vista+)

Nikolay Sivov nsivov at codeweavers.com
Sat Mar 27 11:23:19 CDT 2010


---
 dlls/shlwapi/ordinal.c    |   40 ++++++++++++++++++----------------------
 dlls/shlwapi/shlwapi.spec |    2 +-
 include/shlwapi.h         |    9 +++++++++
 3 files changed, 28 insertions(+), 23 deletions(-)

diff --git a/dlls/shlwapi/ordinal.c b/dlls/shlwapi/ordinal.c
index bb17734..a79eace 100644
--- a/dlls/shlwapi/ordinal.c
+++ b/dlls/shlwapi/ordinal.c
@@ -1634,6 +1634,8 @@ BOOL WINAPI SHLoadMenuPopup(HINSTANCE hInst, LPCWSTR szName)
 {
   HMENU hMenu;
 
+  TRACE("%p %s\n", hInst, debugstr_w(szName));
+
   if ((hMenu = LoadMenuW(hInst, szName)))
   {
     if (GetSubMenu(hMenu, 0))
@@ -1791,6 +1793,8 @@ BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj,
   DWORD dwEffect = DROPEFFECT_LINK | DROPEFFECT_MOVE | DROPEFFECT_COPY;
   POINTL pt = { 0, 0 };
 
+  TRACE("%p %p 0x%08x %p %p\n", pDrop, pDataObj, grfKeyState, lpPt, pdwEffect);
+
   if (!lpPt)
     lpPt = &pt;
 
@@ -1799,7 +1803,7 @@ BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj,
 
   IDropTarget_DragEnter(pDrop, pDataObj, grfKeyState, *lpPt, pdwEffect);
 
-  if (*pdwEffect)
+  if (*pdwEffect != DROPEFFECT_NONE)
     return IDropTarget_Drop(pDrop, pDataObj, grfKeyState, *lpPt, pdwEffect);
 
   IDropTarget_DragLeave(pDrop);
@@ -1891,7 +1895,7 @@ HRESULT WINAPI IUnknown_OnFocusOCS(IUnknown *lpUnknown, BOOL fGotFocus)
   IOleControlSite* lpCSite = NULL;
   HRESULT hRet = E_FAIL;
 
-  TRACE("(%p,%s)\n", lpUnknown, fGotFocus ? "TRUE" : "FALSE");
+  TRACE("(%p, %d)\n", lpUnknown, fGotFocus);
   if (lpUnknown)
   {
     hRet = IUnknown_QueryInterface(lpUnknown, &IID_IOleControlSite,
@@ -2149,12 +2153,10 @@ VOID WINAPI IUnknown_Set(IUnknown **lppDest, IUnknown *lpUnknown)
 {
   TRACE("(%p,%p)\n", lppDest, lpUnknown);
 
-  if (lppDest)
-    IUnknown_AtomicRelease(lppDest); /* Release existing interface */
+  IUnknown_AtomicRelease(lppDest);
 
   if (lpUnknown)
   {
-    /* Copy */
     IUnknown_AddRef(lpUnknown);
     *lppDest = lpUnknown;
   }
@@ -2344,12 +2346,6 @@ BOOL WINAPI FDSA_DeleteItem(FDSA_info *info, DWORD where)
     return TRUE;
 }
 
-
-typedef struct {
-    REFIID   refid;
-    DWORD    indx;
-} IFACE_INDEX_TBL;
-
 /*************************************************************************
  *      @	[SHLWAPI.219]
  *
@@ -2360,22 +2356,22 @@ typedef struct {
  *  Failure: E_POINTER or E_NOINTERFACE.
  */
 HRESULT WINAPI QISearch(
-	LPVOID w,           /* [in]   Table of interfaces */
-	IFACE_INDEX_TBL *x, /* [in]   Array of REFIIDs and indexes into the table */
+	void *base,         /* [in]   Table of interfaces */
+	const QITAB *table, /* [in]   Array of REFIIDs and indexes into the table */
 	REFIID riid,        /* [in]   REFIID to get interface for */
-	LPVOID *ppv)          /* [out]  Destination for interface pointer */
+	void **ppv)         /* [out]  Destination for interface pointer */
 {
 	HRESULT ret;
 	IUnknown *a_vtbl;
-	IFACE_INDEX_TBL *xmove;
+	const QITAB *xmove;
 
-	TRACE("(%p %p %s %p)\n", w,x,debugstr_guid(riid),ppv);
+	TRACE("(%p %p %s %p)\n", base, table, debugstr_guid(riid), ppv);
 	if (ppv) {
-	    xmove = x;
-	    while (xmove->refid) {
-		TRACE("trying (indx %d) %s\n", xmove->indx, debugstr_guid(xmove->refid));
-		if (IsEqualIID(riid, xmove->refid)) {
-		    a_vtbl = (IUnknown*)(xmove->indx + (LPBYTE)w);
+	    xmove = table;
+	    while (xmove->piid) {
+		TRACE("trying (offset %d) %s\n", xmove->dwOffset, debugstr_guid(xmove->piid));
+		if (IsEqualIID(riid, xmove->piid)) {
+		    a_vtbl = (IUnknown*)(xmove->dwOffset + (LPBYTE)base);
 		    TRACE("matched, returning (%p)\n", a_vtbl);
                     *ppv = a_vtbl;
 		    IUnknown_AddRef(a_vtbl);
@@ -2385,7 +2381,7 @@ HRESULT WINAPI QISearch(
 	    }
 
 	    if (IsEqualIID(riid, &IID_IUnknown)) {
-		a_vtbl = (IUnknown*)(x->indx + (LPBYTE)w);
+		a_vtbl = (IUnknown*)(table->dwOffset + (LPBYTE)base);
 		TRACE("returning first for IUnknown (%p)\n", a_vtbl);
                 *ppv = a_vtbl;
 		IUnknown_AddRef(a_vtbl);
diff --git a/dlls/shlwapi/shlwapi.spec b/dlls/shlwapi/shlwapi.spec
index d899232..367046b 100644
--- a/dlls/shlwapi/shlwapi.spec
+++ b/dlls/shlwapi/shlwapi.spec
@@ -216,7 +216,7 @@
 216 stdcall -noname SHAnsiToUnicodeCP(long str ptr long)
 217 stdcall -noname SHUnicodeToAnsi(wstr ptr ptr)
 218 stdcall -noname SHUnicodeToAnsiCP(long wstr ptr long)
-219 stdcall -noname QISearch(long long long long)
+219 stdcall QISearch(long long long long)
 220 stdcall -noname SHSetDefaultDialogFont(ptr long)
 221 stdcall -noname SHRemoveDefaultDialogFont(ptr)
 222 stdcall -noname SHGlobalCounterCreate(long)
diff --git a/include/shlwapi.h b/include/shlwapi.h
index b449cfa..223bcdd 100644
--- a/include/shlwapi.h
+++ b/include/shlwapi.h
@@ -1085,6 +1085,15 @@ BOOL WINAPI IsOS(DWORD);
 #define FDTF_RTLDATE            0x00000200
 #define FDTF_NOAUTOREADINGORDER 0x00000400
 
+
+typedef struct
+{
+    const IID *piid;
+    int        dwOffset;
+} QITAB, *LPQITAB;
+
+HRESULT WINAPI QISearch(void* base, const QITAB *pqit, REFIID riid, void **ppv);
+
 #include <poppack.h> 
 
 #ifdef __cplusplus
-- 
1.5.6.5


--=-/aECs8k5M2qLfgFWKITQ--




More information about the wine-patches mailing list