shlwapi

Jürgen Schmied juergenschmied at lycos.de
Sat Jun 29 04:10:09 CDT 2002


- small fixes
- implementations for SHLWAPI_267,  SHLWAPI_268

please apply after shell32 patch since this patch also changes STRRET related 
functions.

---
together with the shell32 patch the myfolder.dll starts working partially.
---
juergen.schmied at debitel.net



-------------- next part --------------
Index: wine/dlls/shlwapi/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/Makefile.in,v
retrieving revision 1.17
diff -d -u -r1.17 Makefile.in
--- wine/dlls/shlwapi/Makefile.in	4 Jun 2002 23:11:09 -0000	1.17
+++ wine/dlls/shlwapi/Makefile.in	27 Jun 2002 09:51:30 -0000
@@ -4,7 +4,7 @@
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = shlwapi.dll
-IMPORTS   = user32 gdi32 advapi32 kernel32
+IMPORTS   = user32 gdi32 advapi32 kernel32 ole32
 EXTRALIBS = $(LIBUUID) $(LIBUNICODE)
 
 LDDLLFLAGS = @LDDLLFLAGS@
@@ -28,3 +28,4 @@
 @MAKE_DLL_RULES@
 
 ### Dependencies:
+
Index: wine/dlls/shlwapi/ordinal.c
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/ordinal.c,v
retrieving revision 1.40
diff -d -u -r1.40 ordinal.c
--- wine/dlls/shlwapi/ordinal.c	31 May 2002 23:40:52 -0000	1.40
+++ wine/dlls/shlwapi/ordinal.c	27 Jun 2002 09:51:34 -0000
@@ -2,7 +2,7 @@
  * SHLWAPI ordinal functions
  *
  * Copyright 1997 Marcus Meissner
- *           1998 Jrgen Schmied
+ *           1998 Jrgen Schmied
  *           2001 Jon Griffiths
  *
  * This library is free software; you can redistribute it and/or
@@ -1512,23 +1512,21 @@
 	LPVOID w,           /* [in]   table of interfaces                   */
 	IFACE_INDEX_TBL *x, /* [in]   array of REFIIDs and indexes to above */
 	REFIID riid,        /* [in]   REFIID to get interface for           */
-	LPVOID *z)          /* [out]  location to get interface pointer     */
+	LPVOID *ppv)          /* [out]  location to get interface pointer     */
 {
 	HRESULT ret;
 	IUnknown *a_vtbl;
 	IFACE_INDEX_TBL *xmove;
 
-	TRACE("(%p %p %s %p)\n",
-	      w,x,debugstr_guid(riid),z);
-	if (z) {
+	TRACE("(%p %p %s %p)\n", w,x,debugstr_guid(riid),ppv);
+	if (ppv) {
 	    xmove = x;
 	    while (xmove->refid) {
-		TRACE("trying (indx %ld) %s\n", xmove->indx,
-		      debugstr_guid(xmove->refid));
+		TRACE("trying (indx %ld) %s\n", xmove->indx, debugstr_guid(xmove->refid));
 		if (IsEqualIID(riid, xmove->refid)) {
 		    a_vtbl = (IUnknown*)(xmove->indx + (LPBYTE)w);
 		    TRACE("matched, returning (%p)\n", a_vtbl);
-		    *z = (LPVOID)a_vtbl;
+		    *ppv = (LPVOID)a_vtbl;
 		    IUnknown_AddRef(a_vtbl);
 		    return S_OK;
 		}
@@ -1538,14 +1536,16 @@
 	    if (IsEqualIID(riid, &IID_IUnknown)) {
 		a_vtbl = (IUnknown*)(x->indx + (LPBYTE)w);
 		TRACE("returning first for IUnknown (%p)\n", a_vtbl);
-		*z = (LPVOID)a_vtbl;
+		*ppv = (LPVOID)a_vtbl;
 		IUnknown_AddRef(a_vtbl);
 		return S_OK;
 	    }
-	    *z = 0;
+	    *ppv = 0;
 	    ret = E_NOINTERFACE;
 	} else
 	    ret = E_POINTER;
+
+	TRACE("-- 0x%08lx\n", ret);
 	return ret;
 }
 
@@ -1686,32 +1686,51 @@
 
 /*************************************************************************
  *      @	[SHLWAPI.267]
+ *
+ * NOTES:
+ *   This QueryInterface asks the inner object for a interface. In case
+ *   of aggregation this request would be forwarded by the inner to the
+ *   outer object. This function asks the inner object directly for the
+ *   interface circumventing the forwarding to the outer object.
  */
 HRESULT WINAPI SHLWAPI_267 (
-	LPVOID w,
-	LPVOID x,
-	LPVOID y, /* [???] NOTE: same as 3rd parameter of SHLWAPI_219 */
-	LPVOID z) /* [???] NOTE: same as 4th parameter of SHLWAPI_219 */
+	IUnknown * pUnk,   /* outer object */
+	IUnknown * pInner, /* inner object */
+	IID * riid,
+	LPVOID* ppv)
 {
-	FIXME("(%p %p %p %p)stub\n",w,x,y,z);
-
-	/* native seems to do:
-	 *  SHLWAPI_219 ((LPVOID)(((LPSTR)x)-4), ???, (REFIID) y, (LPVOID*) z);
-	 */
+	HRESULT hret = E_NOINTERFACE;
+	TRACE("(pUnk=%p pInner=%p\n\tIID:  %s %p)\n",pUnk,pInner,debugstr_guid(riid), ppv);
 
-	*((LPDWORD)z) = 0xabba1200;
-	return /* 0xabba1254 */ 0;
+	*ppv = NULL;	
+	if(pUnk && pInner) {
+	    hret = IUnknown_QueryInterface(pInner, riid, (LPVOID*)ppv);
+	    if (SUCCEEDED(hret)) IUnknown_Release(pUnk);
+	}
+	TRACE("-- 0x%08lx\n", hret);
+	return hret;
 }
 
 /*************************************************************************
  *      @	[SHLWAPI.268]
+ * NOTES
+ *   pInner is returned by SHLWAPI_267 as ppv
  */
 DWORD WINAPI SHLWAPI_268 (
-	LPVOID w,
-	LPVOID x)
+	IUnknown * pUnk,
+	IUnknown ** pInner)
 {
-	FIXME("(%p %p)\n",w,x);
-	return 0xabba1251; /* 0 = failure */
+	DWORD ret = 0;
+
+	TRACE("(pUnk=%p pInner=%p)\n",pUnk,pInner);
+
+	IUnknown_AddRef(pUnk);
+	if (pInner && *pInner) {
+	  ret = IUnknown_Release(*pInner);
+	  *pInner = NULL;
+	}
+	TRACE("-- count=%lu\n",ret);
+	return ret;
 }
 
 /*************************************************************************
@@ -2474,3 +2493,11 @@
     TlsSetValue(SHLWAPI_ThreadRef_index, (LPVOID) punk);
     return S_OK;
 }
+
+
+
+
+
+
+
+
Index: wine/dlls/shlwapi/shlwapi.spec
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/shlwapi.spec,v
retrieving revision 1.38
diff -d -u -r1.38 shlwapi.spec
--- wine/dlls/shlwapi/shlwapi.spec	21 Jun 2002 19:15:49 -0000	1.38
+++ wine/dlls/shlwapi/shlwapi.spec	27 Jun 2002 09:51:39 -0000
@@ -724,3 +724,4 @@
 @ stub    StrFormatByteSize64A
 @ stub    StrFormatKBSizeA
 @ stub    StrFormatKBSizeW
+
Index: wine/dlls/shlwapi/string.c
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/string.c,v
retrieving revision 1.22
diff -d -u -r1.22 string.c
--- wine/dlls/shlwapi/string.c	4 Jun 2002 23:11:09 -0000	1.22
+++ wine/dlls/shlwapi/string.c	27 Jun 2002 09:51:40 -0000
@@ -486,14 +486,14 @@
 	{
 	  case STRRET_WSTR:
 	    WideCharToMultiByte(CP_ACP, 0, src->u.pOleStr, -1, (LPSTR)dest, len, NULL, NULL);
-/*	    SHFree(src->u.pOleStr);  FIXME: is this right? */
+	    CoTaskMemFree(src->u.pOleStr); 
 	    break;
 
-	  case STRRET_CSTRA:
+	  case STRRET_CSTR:
 	    lstrcpynA((LPSTR)dest, src->u.cStr, len);
 	    break;
 
-	  case STRRET_OFFSETA:
+	  case STRRET_OFFSET:
 	    lstrcpynA((LPSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
 	    break;
 
@@ -531,15 +531,15 @@
 	{
 	  case STRRET_WSTR:
 	    lstrcpynW((LPWSTR)dest, src->u.pOleStr, len);
-/*	    SHFree(src->u.pOleStr);  FIXME: is this right? */
+	    CoTaskMemFree(src->u.pOleStr); 
 	    break;
 
-	  case STRRET_CSTRA:
+	  case STRRET_CSTR:
               if (!MultiByteToWideChar( CP_ACP, 0, src->u.cStr, -1, dest, len ) && len)
                   dest[len-1] = 0;
 	    break;
 
-	  case STRRET_OFFSETA:
+	  case STRRET_OFFSET:
 	    if (pidl)
 	    {
               if (!MultiByteToWideChar( CP_ACP, 0, ((LPCSTR)&pidl->mkid)+src->u.uOffset, -1,
@@ -634,3 +634,8 @@
     TRACE("<- '%s'\n", pszSource);
     return trimmed;
 }
+
+
+
+
+



More information about the wine-patches mailing list