Michael Stefaniuc : shell32: Use an iface instead of a vtbl pointer in ShellItem.

Alexandre Julliard julliard at winehq.org
Fri Dec 17 11:30:44 CST 2010


Module: wine
Branch: master
Commit: 3f213cb798e73f9447bd4e0ea73ba12692977c46
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3f213cb798e73f9447bd4e0ea73ba12692977c46

Author: Michael Stefaniuc <mstefani at redhat.de>
Date:   Thu Dec 16 01:04:28 2010 +0100

shell32: Use an iface instead of a vtbl pointer in ShellItem.

---

 dlls/shell32/shellitem.c |   46 ++++++++++++++++++++++++++--------------------
 1 files changed, 26 insertions(+), 20 deletions(-)

diff --git a/dlls/shell32/shellitem.c b/dlls/shell32/shellitem.c
index 805731f..d694503 100644
--- a/dlls/shell32/shellitem.c
+++ b/dlls/shell32/shellitem.c
@@ -39,23 +39,28 @@
 WINE_DEFAULT_DEBUG_CHANNEL(shell);
 
 typedef struct _ShellItem {
-    const IShellItemVtbl    *lpIShellItemVtbl;
+    IShellItem              IShellItem_iface;
     LONG                    ref;
     LPITEMIDLIST            pidl;
-    const IPersistIDListVtbl *lpIPersistIDListVtbl;
+    IPersistIDList          IPersistIDList_iface;
 } ShellItem;
 
+static inline ShellItem *impl_from_IShellItem(IShellItem *iface)
+{
+    return CONTAINING_RECORD(iface, ShellItem, IShellItem_iface);
+}
+
 
 static inline ShellItem *impl_from_IPersistIDList( IPersistIDList *iface )
 {
-    return (ShellItem*)((char*)iface - FIELD_OFFSET(ShellItem, lpIPersistIDListVtbl));
+    return CONTAINING_RECORD(iface, ShellItem, IPersistIDList_iface);
 }
 
 
 static HRESULT WINAPI ShellItem_QueryInterface(IShellItem *iface, REFIID riid,
     void **ppv)
 {
-    ShellItem *This = (ShellItem*)iface;
+    ShellItem *This = impl_from_IShellItem(iface);
 
     TRACE("(%p,%p,%p)\n", iface, riid, ppv);
 
@@ -67,7 +72,7 @@ static HRESULT WINAPI ShellItem_QueryInterface(IShellItem *iface, REFIID riid,
     }
     else if (IsEqualIID(&IID_IPersist, riid) || IsEqualIID(&IID_IPersistIDList, riid))
     {
-        *ppv = &(This->lpIPersistIDListVtbl);
+        *ppv = &This->IPersistIDList_iface;
     }
     else {
         FIXME("not implemented for %s\n", shdebugstr_guid(riid));
@@ -81,7 +86,7 @@ static HRESULT WINAPI ShellItem_QueryInterface(IShellItem *iface, REFIID riid,
 
 static ULONG WINAPI ShellItem_AddRef(IShellItem *iface)
 {
-    ShellItem *This = (ShellItem*)iface;
+    ShellItem *This = impl_from_IShellItem(iface);
     ULONG ref = InterlockedIncrement(&This->ref);
 
     TRACE("(%p), new refcount=%i\n", iface, ref);
@@ -91,7 +96,7 @@ static ULONG WINAPI ShellItem_AddRef(IShellItem *iface)
 
 static ULONG WINAPI ShellItem_Release(IShellItem *iface)
 {
-    ShellItem *This = (ShellItem*)iface;
+    ShellItem *This = impl_from_IShellItem(iface);
     ULONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("(%p), new refcount=%i\n", iface, ref);
@@ -174,7 +179,7 @@ static HRESULT ShellItem_get_shellfolder(ShellItem *This, IBindCtx *pbc, IShellF
 static HRESULT WINAPI ShellItem_BindToHandler(IShellItem *iface, IBindCtx *pbc,
     REFGUID rbhid, REFIID riid, void **ppvOut)
 {
-    ShellItem *This = (ShellItem*)iface;
+    ShellItem *This = impl_from_IShellItem(iface);
     HRESULT ret;
     TRACE("(%p,%p,%s,%p,%p)\n", iface, pbc, shdebugstr_guid(rbhid), riid, ppvOut);
 
@@ -208,7 +213,8 @@ static HRESULT WINAPI ShellItem_BindToHandler(IShellItem *iface, IBindCtx *pbc,
     }
     else if (IsEqualGUID(rbhid, &BHID_DataObject))
     {
-        return ShellItem_BindToHandler((IShellItem*)This, pbc, &BHID_SFUIObject, &IID_IDataObject, ppvOut);
+        return ShellItem_BindToHandler(&This->IShellItem_iface, pbc, &BHID_SFUIObject,
+                                       &IID_IDataObject, ppvOut);
     }
 
     FIXME("Unsupported BHID %s.\n", debugstr_guid(rbhid));
@@ -218,7 +224,7 @@ static HRESULT WINAPI ShellItem_BindToHandler(IShellItem *iface, IBindCtx *pbc,
 
 static HRESULT WINAPI ShellItem_GetParent(IShellItem *iface, IShellItem **ppsi)
 {
-    ShellItem *This = (ShellItem*)iface;
+    ShellItem *This = impl_from_IShellItem(iface);
     LPITEMIDLIST parent_pidl;
     HRESULT ret;
 
@@ -237,7 +243,7 @@ static HRESULT WINAPI ShellItem_GetParent(IShellItem *iface, IShellItem **ppsi)
 static HRESULT WINAPI ShellItem_GetDisplayName(IShellItem *iface, SIGDN sigdnName,
     LPWSTR *ppszName)
 {
-    ShellItem *This = (ShellItem*)iface;
+    ShellItem *This = impl_from_IShellItem(iface);
     TRACE("(%p,%x,%p)\n", iface, sigdnName, ppszName);
 
     return SHGetNameFromIDList(This->pidl, sigdnName, ppszName);
@@ -246,7 +252,7 @@ static HRESULT WINAPI ShellItem_GetDisplayName(IShellItem *iface, SIGDN sigdnNam
 static HRESULT WINAPI ShellItem_GetAttributes(IShellItem *iface, SFGAOF sfgaoMask,
     SFGAOF *psfgaoAttribs)
 {
-    ShellItem *This = (ShellItem*)iface;
+    ShellItem *This = impl_from_IShellItem(iface);
     IShellFolder *parent_folder;
     LPITEMIDLIST child_pidl;
     HRESULT ret;
@@ -340,19 +346,19 @@ static HRESULT WINAPI ShellItem_IPersistIDList_QueryInterface(IPersistIDList *if
     REFIID riid, void **ppv)
 {
     ShellItem *This = impl_from_IPersistIDList(iface);
-    return ShellItem_QueryInterface((IShellItem*)This, riid, ppv);
+    return ShellItem_QueryInterface(&This->IShellItem_iface, riid, ppv);
 }
 
 static ULONG WINAPI ShellItem_IPersistIDList_AddRef(IPersistIDList *iface)
 {
     ShellItem *This = impl_from_IPersistIDList(iface);
-    return ShellItem_AddRef((IShellItem*)This);
+    return ShellItem_AddRef(&This->IShellItem_iface);
 }
 
 static ULONG WINAPI ShellItem_IPersistIDList_Release(IPersistIDList *iface)
 {
     ShellItem *This = impl_from_IPersistIDList(iface);
-    return ShellItem_Release((IShellItem*)This);
+    return ShellItem_Release(&This->IShellItem_iface);
 }
 
 static HRESULT WINAPI ShellItem_IPersistIDList_GetClassID(IPersistIDList* iface,
@@ -419,13 +425,13 @@ HRESULT WINAPI IShellItem_Constructor(IUnknown *pUnkOuter, REFIID riid, void **p
     if (pUnkOuter) return CLASS_E_NOAGGREGATION;
 
     This = HeapAlloc(GetProcessHeap(), 0, sizeof(ShellItem));
-    This->lpIShellItemVtbl = &ShellItem_Vtbl;
+    This->IShellItem_iface.lpVtbl = &ShellItem_Vtbl;
     This->ref = 1;
     This->pidl = NULL;
-    This->lpIPersistIDListVtbl = &ShellItem_IPersistIDList_Vtbl;
+    This->IPersistIDList_iface.lpVtbl = &ShellItem_IPersistIDList_Vtbl;
 
-    ret = ShellItem_QueryInterface((IShellItem*)This, riid, ppv);
-    ShellItem_Release((IShellItem*)This);
+    ret = ShellItem_QueryInterface(&This->IShellItem_iface, riid, ppv);
+    ShellItem_Release(&This->IShellItem_iface);
 
     return ret;
 }
@@ -483,7 +489,7 @@ HRESULT WINAPI SHCreateShellItem(LPCITEMIDLIST pidlParent,
     ret = IShellItem_Constructor(NULL, &IID_IShellItem, (void**)&This);
     if (This)
     {
-        *ppsi = (IShellItem*)This;
+        *ppsi = &This->IShellItem_iface;
         This->pidl = new_pidl;
     }
     else




More information about the wine-cvs mailing list