SHELL32: forward AddRef, Release, QueryInterface and GetClassID to internal implementations

Mike McCormack mike at codeweavers.com
Wed Jun 15 11:36:47 CDT 2005


ChangeLog:
* forward AddRef, Release, QueryInterface and GetClassID to internal 
implementations
* implement GetClassID properly
-------------- next part --------------
? dlls/shell32/tests/cabinet.c
? dlls/shell32/tests/pidl.c
Index: dlls/shell32/shelllink.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shelllink.c,v
retrieving revision 1.99
diff -u -p -r1.99 shelllink.c
--- dlls/shell32/shelllink.c	15 Jun 2005 10:21:46 -0000	1.99
+++ dlls/shell32/shelllink.c	15 Jun 2005 16:36:20 -0000
@@ -213,6 +213,102 @@ inline static LPWSTR HEAP_strdupAtoW( HA
 }
 
 /**************************************************************************
+ *  ShellLink::QueryInterface implementation
+ */
+static HRESULT ShellLink_QueryInterface( IShellLinkImpl *This, REFIID riid,  LPVOID *ppvObj)
+{
+    TRACE("(%p)->(\n\tIID:\t%s)\n",This,debugstr_guid(riid));
+
+    *ppvObj = NULL;
+
+    if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IShellLinkA))
+    {
+        *ppvObj = This;
+    }
+    else if(IsEqualIID(riid, &IID_IShellLinkW))
+    {
+        *ppvObj = &(This->lpvtblw);
+    }
+    else if(IsEqualIID(riid, &IID_IPersistFile))
+    {
+        *ppvObj = &(This->lpvtblPersistFile);
+    }
+    else if(IsEqualIID(riid, &IID_IPersistStream))
+    {
+        *ppvObj = &(This->lpvtblPersistStream);
+    }
+    else if(IsEqualIID(riid, &IID_IShellLinkDataList))
+    {
+        *ppvObj = &(This->lpvtblShellLinkDataList);
+    }
+    else if(IsEqualIID(riid, &IID_IShellExtInit))
+    {
+        *ppvObj = &(This->lpvtblShellExtInit);
+    }
+    else if(IsEqualIID(riid, &IID_IContextMenu))
+    {
+        *ppvObj = &(This->lpvtblContextMenu);
+    }
+
+    if(*ppvObj)
+    {
+        IUnknown_AddRef((IUnknown*)(*ppvObj));
+        TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+        return S_OK;
+    }
+    ERR("-- Interface: E_NOINTERFACE\n");
+    return E_NOINTERFACE;
+}
+
+/**************************************************************************
+ *  ShellLink::AddRef implementation
+ */
+static ULONG ShellLink_AddRef( IShellLinkImpl *This )
+{
+    ULONG refCount = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p)->(count=%lu)\n", This, refCount - 1);
+
+    return refCount;
+}
+
+/**************************************************************************
+ *  ShellLink::Release implementation
+ */
+static ULONG ShellLink_Release( IShellLinkImpl *This )
+{
+    ULONG refCount = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p)->(count=%lu)\n", This, refCount + 1);
+
+    if (refCount)
+        return refCount;
+
+    TRACE("-- destroying IShellLink(%p)\n",This);
+
+    HeapFree(GetProcessHeap(), 0, This->sIcoPath);
+    HeapFree(GetProcessHeap(), 0, This->sArgs);
+    HeapFree(GetProcessHeap(), 0, This->sWorkDir);
+    HeapFree(GetProcessHeap(), 0, This->sDescription);
+    HeapFree(GetProcessHeap(),0,This->sPath);
+
+    if (This->pPidl)
+        ILFree(This->pPidl);
+
+    LocalFree((HANDLE)This);
+
+    return 0;
+}
+
+static HRESULT ShellLink_GetClassID( IShellLinkImpl *This, CLSID *pclsid )
+{
+    TRACE("%p %p\n", This, pclsid);
+
+    memcpy( pclsid, &CLSID_ShellLink, sizeof (CLSID) );
+    return S_OK;
+}
+
+/**************************************************************************
  *  IPersistFile_QueryInterface
  */
 static HRESULT WINAPI IPersistFile_fnQueryInterface(
@@ -221,7 +317,7 @@ static HRESULT WINAPI IPersistFile_fnQue
 	LPVOID *ppvObj)
 {
     _ICOM_THIS_From_IPersistFile(IShellLinkImpl, iface);
-    return IShellLinkA_QueryInterface((IShellLinkA*)This, riid, ppvObj);
+    return ShellLink_QueryInterface( This, riid, ppvObj );
 }
 
 /******************************************************************************
@@ -230,7 +326,7 @@ static HRESULT WINAPI IPersistFile_fnQue
 static ULONG WINAPI IPersistFile_fnAddRef(IPersistFile* iface)
 {
     _ICOM_THIS_From_IPersistFile(IShellLinkImpl, iface);
-    return IShellLinkA_AddRef((IShellLinkA*)This);
+    return ShellLink_AddRef( This );
 }
 
 /******************************************************************************
@@ -244,9 +340,8 @@ static ULONG WINAPI IPersistFile_fnRelea
 
 static HRESULT WINAPI IPersistFile_fnGetClassID(IPersistFile* iface, CLSID *pClassID)
 {
-	_ICOM_THIS_From_IPersistFile(IShellLinkImpl, iface);
-	FIXME("(%p)\n",This);
-	return NOERROR;
+    _ICOM_THIS_From_IPersistFile(IShellLinkImpl, iface);
+    return ShellLink_GetClassID( This, pClassID );
 }
 
 static HRESULT WINAPI IPersistFile_fnIsDirty(IPersistFile* iface)
@@ -382,10 +477,10 @@ static const IPersistFileVtbl pfvt =
 static HRESULT WINAPI IPersistStream_fnQueryInterface(
 	IPersistStream* iface,
 	REFIID     riid,
-	VOID**     ppvoid)
+	VOID**     ppvObj)
 {
     _ICOM_THIS_From_IPersistStream(IShellLinkImpl, iface);
-    return IShellLinkA_QueryInterface((IShellLinkA*)This, riid, ppvoid);
+    return ShellLink_QueryInterface( This, riid, ppvObj );
 }
 
 /************************************************************************
@@ -405,7 +500,7 @@ static ULONG WINAPI IPersistStream_fnAdd
 	IPersistStream* iface)
 {
     _ICOM_THIS_From_IPersistStream(IShellLinkImpl, iface);
-    return IShellLinkA_AddRef((IShellLinkA*)This);
+    return ShellLink_AddRef( This );
 }
 
 /************************************************************************
@@ -416,16 +511,8 @@ static HRESULT WINAPI IPersistStream_fnG
 	IPersistStream* iface,
 	CLSID* pClassID)
 {
-	_ICOM_THIS_From_IPersistStream(IShellLinkImpl, iface);
-
-	TRACE("(%p)\n", This);
-
-	if (pClassID==0)
-	  return E_POINTER;
-
-/*	memcpy(pClassID, &CLSID_???, sizeof(CLSID_???)); */
-
-	return S_OK;
+    _ICOM_THIS_From_IPersistStream(IShellLinkImpl, iface);
+    return ShellLink_GetClassID( This, pClassID );
 }
 
 /************************************************************************
@@ -1215,50 +1302,8 @@ HRESULT WINAPI IShellLink_ConstructFromF
  */
 static HRESULT WINAPI IShellLinkA_fnQueryInterface( IShellLinkA * iface, REFIID riid,  LPVOID *ppvObj)
 {
-	IShellLinkImpl *This = (IShellLinkImpl *)iface;
-
-	TRACE("(%p)->(\n\tIID:\t%s)\n",This,debugstr_guid(riid));
-
-	*ppvObj = NULL;
-
-	if(IsEqualIID(riid, &IID_IUnknown) ||
-	   IsEqualIID(riid, &IID_IShellLinkA))
-	{
-	  *ppvObj = This;
-	}
-	else if(IsEqualIID(riid, &IID_IShellLinkW))
-	{
-	  *ppvObj = &(This->lpvtblw);
-	}
-	else if(IsEqualIID(riid, &IID_IPersistFile))
-	{
-	  *ppvObj = &(This->lpvtblPersistFile);
-	}
-	else if(IsEqualIID(riid, &IID_IPersistStream))
-	{
-	  *ppvObj = &(This->lpvtblPersistStream);
-	}
-	else if(IsEqualIID(riid, &IID_IShellLinkDataList))
-	{
-	  *ppvObj = &(This->lpvtblShellLinkDataList);
-	}
-	else if(IsEqualIID(riid, &IID_IShellExtInit))
-	{
-	  *ppvObj = &(This->lpvtblShellExtInit);
-	}
-	else if(IsEqualIID(riid, &IID_IContextMenu))
-	{
-	  *ppvObj = &(This->lpvtblContextMenu);
-	}
-
-	if(*ppvObj)
-	{
-	  IUnknown_AddRef((IUnknown*)(*ppvObj));
-	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
-	  return S_OK;
-	}
-	ERR("-- Interface: E_NOINTERFACE\n");
-	return E_NOINTERFACE;
+    IShellLinkImpl *This = (IShellLinkImpl *)iface;
+    return ShellLink_QueryInterface( This, riid, ppvObj );
 }
 
 /******************************************************************************
@@ -1266,12 +1311,8 @@ static HRESULT WINAPI IShellLinkA_fnQuer
  */
 static ULONG WINAPI IShellLinkA_fnAddRef(IShellLinkA * iface)
 {
-	IShellLinkImpl *This = (IShellLinkImpl *)iface;
-	ULONG refCount = InterlockedIncrement(&This->ref);
-
-	TRACE("(%p)->(count=%lu)\n", This, refCount - 1);
-
-	return refCount;
+    IShellLinkImpl *This = (IShellLinkImpl *)iface;
+    return ShellLink_AddRef( This );
 }
 
 /******************************************************************************
@@ -1280,27 +1321,7 @@ static ULONG WINAPI IShellLinkA_fnAddRef
 static ULONG WINAPI IShellLinkA_fnRelease(IShellLinkA * iface)
 {
     IShellLinkImpl *This = (IShellLinkImpl *)iface;
-    ULONG refCount = InterlockedDecrement(&This->ref);
-
-    TRACE("(%p)->(count=%lu)\n", This, refCount + 1);
-
-    if (refCount)
-        return refCount;
-
-    TRACE("-- destroying IShellLink(%p)\n",This);
-
-    HeapFree(GetProcessHeap(), 0, This->sIcoPath);
-    HeapFree(GetProcessHeap(), 0, This->sArgs);
-    HeapFree(GetProcessHeap(), 0, This->sWorkDir);
-    HeapFree(GetProcessHeap(), 0, This->sDescription);
-    HeapFree(GetProcessHeap(),0,This->sPath);
-
-    if (This->pPidl)
-        ILFree(This->pPidl);
-
-    LocalFree((HANDLE)This);
-
-    return 0;
+    return ShellLink_Release( This );
 }
 
 static HRESULT WINAPI IShellLinkA_fnGetPath(IShellLinkA * iface, LPSTR pszFile,
@@ -1653,7 +1674,7 @@ static HRESULT WINAPI IShellLinkW_fnQuer
   IShellLinkW * iface, REFIID riid, LPVOID *ppvObj)
 {
     _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface);
-    return IShellLinkA_QueryInterface((IShellLinkA*)This, riid, ppvObj);
+    return ShellLink_QueryInterface( This, riid, ppvObj );
 }
 
 /******************************************************************************
@@ -1662,16 +1683,16 @@ static HRESULT WINAPI IShellLinkW_fnQuer
 static ULONG WINAPI IShellLinkW_fnAddRef(IShellLinkW * iface)
 {
     _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface);
-    return IShellLinkA_AddRef((IShellLinkA*)This);
+    return ShellLink_AddRef( This );
 }
+
 /******************************************************************************
  * IShellLinkW_fnRelease
  */
-
 static ULONG WINAPI IShellLinkW_fnRelease(IShellLinkW * iface)
 {
     _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface);
-    return IShellLinkA_Release((IShellLinkA*)This);
+    return ShellLink_Release( This );
 }
 
 static HRESULT WINAPI IShellLinkW_fnGetPath(IShellLinkW * iface, LPWSTR pszFile,INT cchMaxPath, WIN32_FIND_DATAW *pfd, DWORD fFlags)
@@ -2199,7 +2220,7 @@ static ULONG WINAPI
 ShellLink_DataList_Release( IShellLinkDataList* iface )
 {
     _ICOM_THIS_From_IShellLinkDataList(IShellLinkImpl, iface);
-    return IShellLinkA_Release((IShellLinkA*)This);
+    return ShellLink_Release( This );
 }
 
 static HRESULT WINAPI
@@ -2267,7 +2288,7 @@ static ULONG WINAPI
 ShellLink_ExtInit_Release( IShellExtInit* iface )
 {
     _ICOM_THIS_From_IShellExtInit(IShellLinkImpl, iface);
-    return IShellLinkA_Release((IShellLinkA*)This);
+    return ShellLink_Release( This );
 }
 
 /**************************************************************************
@@ -2347,7 +2368,7 @@ static ULONG WINAPI
 ShellLink_ContextMenu_Release( IContextMenu* iface )
 {
     _ICOM_THIS_From_IContextMenu(IShellLinkImpl, iface);
-    return IShellLinkA_Release((IShellLinkA*)This);
+    return ShellLink_Release( This );
 }
 
 static HRESULT WINAPI


More information about the wine-patches mailing list