- implementations for SHLWAPI_267, SHLWAPI_268
- small fixes
diff --git a/dlls/Makefile.in b/dlls/Makefile.in
index c582a40..1751421 100644
--- a/dlls/Makefile.in
+++ b/dlls/Makefile.in
@@ -812,7 +812,8 @@
shell32: ole32.dll$(DLLEXT) shlwapi.dll$(DLLEXT) comctl32.dll$(DLLEXT) user32.dll$(DLLEXT) \
gdi32.dll$(DLLEXT) advapi32.dll$(DLLEXT) kernel32.dll$(DLLEXT)
shfolder: shell32.dll$(DLLEXT)
-shlwapi: user32.dll$(DLLEXT) gdi32.dll$(DLLEXT) advapi32.dll$(DLLEXT) kernel32.dll$(DLLEXT)
+shlwapi: ole32.dll$(DLLEXT) user32.dll$(DLLEXT) gdi32.dll$(DLLEXT) advapi32.dll$(DLLEXT) \
+ kernel32.dll$(DLLEXT)
snmpapi: kernel32.dll$(DLLEXT)
sti: kernel32.dll$(DLLEXT)
tapi32: kernel32.dll$(DLLEXT)
diff --git a/dlls/shlwapi/Makefile.in b/dlls/shlwapi/Makefile.in
index b9f1be8..704e401 100644
--- a/dlls/shlwapi/Makefile.in
+++ b/dlls/shlwapi/Makefile.in
@@ -4,7 +4,8 @@
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = shlwapi.dll
-IMPORTS = user32 gdi32 advapi32 kernel32
+# fixme: avoid ole32.dll import
+IMPORTS = ole32 user32 gdi32 advapi32 kernel32
EXTRALIBS = $(LIBUUID) $(LIBUNICODE)
LDDLLFLAGS = @LDDLLFLAGS@
diff --git a/dlls/shlwapi/ordinal.c b/dlls/shlwapi/ordinal.c
index 08aecaf..d96676e 100644
--- a/dlls/shlwapi/ordinal.c
+++ b/dlls/shlwapi/ordinal.c
@@ -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);
+ HRESULT hret = E_NOINTERFACE;
+ TRACE("(pUnk=%p pInner=%p\n\tIID: %s %p)\n",pUnk,pInner,debugstr_guid(riid), ppv);
- /* native seems to do:
- * SHLWAPI_219 ((LPVOID)(((LPSTR)x)-4), ???, (REFIID) y, (LPVOID*) z);
- */
-
- *((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;
}
/*************************************************************************
diff --git a/dlls/shlwapi/string.c b/dlls/shlwapi/string.c
index 11ea0c6..6c47570 100644
--- a/dlls/shlwapi/string.c
+++ b/dlls/shlwapi/string.c
@@ -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,