shell32: COM cleanup for IExtractIconA.
This commit is contained in:
parent
725db4d19d
commit
f4f9be6eb0
|
@ -49,9 +49,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
IExtractIconW IExtractIconW_iface;
|
IExtractIconW IExtractIconW_iface;
|
||||||
|
IExtractIconA IExtractIconA_iface;
|
||||||
LONG ref;
|
LONG ref;
|
||||||
const IPersistFileVtbl *lpvtblPersistFile;
|
const IPersistFileVtbl *lpvtblPersistFile;
|
||||||
const IExtractIconAVtbl *lpvtblExtractIconA;
|
|
||||||
LPITEMIDLIST pidl;
|
LPITEMIDLIST pidl;
|
||||||
} IExtractIconWImpl;
|
} IExtractIconWImpl;
|
||||||
|
|
||||||
|
@ -60,6 +60,11 @@ static inline IExtractIconWImpl *impl_from_IExtractIconW(IExtractIconW *iface)
|
||||||
return CONTAINING_RECORD(iface, IExtractIconWImpl, IExtractIconW_iface);
|
return CONTAINING_RECORD(iface, IExtractIconWImpl, IExtractIconW_iface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline IExtractIconWImpl *impl_from_IExtractIconA(IExtractIconA *iface)
|
||||||
|
{
|
||||||
|
return CONTAINING_RECORD(iface, IExtractIconWImpl, IExtractIconA_iface);
|
||||||
|
}
|
||||||
|
|
||||||
static const IExtractIconAVtbl eiavt;
|
static const IExtractIconAVtbl eiavt;
|
||||||
static const IExtractIconWVtbl eivt;
|
static const IExtractIconWVtbl eivt;
|
||||||
static const IPersistFileVtbl pfvt;
|
static const IPersistFileVtbl pfvt;
|
||||||
|
@ -69,11 +74,6 @@ static inline IExtractIconW *impl_from_IPersistFile( IPersistFile *iface )
|
||||||
return (IExtractIconW *)((char*)iface - FIELD_OFFSET(IExtractIconWImpl, lpvtblPersistFile));
|
return (IExtractIconW *)((char*)iface - FIELD_OFFSET(IExtractIconWImpl, lpvtblPersistFile));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline IExtractIconW *impl_from_IExtractIconA( IExtractIconA *iface )
|
|
||||||
{
|
|
||||||
return (IExtractIconW *)((char*)iface - FIELD_OFFSET(IExtractIconWImpl, lpvtblExtractIconA));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* IExtractIconW_Constructor
|
* IExtractIconW_Constructor
|
||||||
|
@ -88,7 +88,7 @@ IExtractIconW* IExtractIconW_Constructor(LPCITEMIDLIST pidl)
|
||||||
ei->ref=1;
|
ei->ref=1;
|
||||||
ei->IExtractIconW_iface.lpVtbl = &eivt;
|
ei->IExtractIconW_iface.lpVtbl = &eivt;
|
||||||
ei->lpvtblPersistFile = &pfvt;
|
ei->lpvtblPersistFile = &pfvt;
|
||||||
ei->lpvtblExtractIconA = &eiavt;
|
ei->IExtractIconA_iface.lpVtbl = &eiavt;
|
||||||
ei->pidl=ILClone(pidl);
|
ei->pidl=ILClone(pidl);
|
||||||
|
|
||||||
pdump(pidl);
|
pdump(pidl);
|
||||||
|
@ -112,7 +112,7 @@ static HRESULT WINAPI IExtractIconW_fnQueryInterface(IExtractIconW *iface, REFII
|
||||||
else if (IsEqualIID(riid, &IID_IPersistFile))
|
else if (IsEqualIID(riid, &IID_IPersistFile))
|
||||||
*ppv = &This->lpvtblPersistFile;
|
*ppv = &This->lpvtblPersistFile;
|
||||||
else if (IsEqualIID(riid, &IID_IExtractIconA))
|
else if (IsEqualIID(riid, &IID_IExtractIconA))
|
||||||
*ppv = &This->lpvtblExtractIconA;
|
*ppv = &This->IExtractIconA_iface;
|
||||||
|
|
||||||
if(*ppv)
|
if(*ppv)
|
||||||
{
|
{
|
||||||
|
@ -409,59 +409,56 @@ static const IExtractIconWVtbl eivt =
|
||||||
IExtractIconA* IExtractIconA_Constructor(LPCITEMIDLIST pidl)
|
IExtractIconA* IExtractIconA_Constructor(LPCITEMIDLIST pidl)
|
||||||
{
|
{
|
||||||
IExtractIconWImpl *This = (IExtractIconWImpl *)IExtractIconW_Constructor(pidl);
|
IExtractIconWImpl *This = (IExtractIconWImpl *)IExtractIconW_Constructor(pidl);
|
||||||
IExtractIconA *eia = (IExtractIconA *)&This->lpvtblExtractIconA;
|
IExtractIconA *eia = &This->IExtractIconA_iface;
|
||||||
|
|
||||||
TRACE("(%p)->(%p)\n", This, eia);
|
TRACE("(%p)->(%p)\n", This, eia);
|
||||||
return eia;
|
return eia;
|
||||||
}
|
}
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* IExtractIconA_QueryInterface
|
* IExtractIconA::QueryInterface
|
||||||
*/
|
*/
|
||||||
static HRESULT WINAPI IExtractIconA_fnQueryInterface(IExtractIconA * iface, REFIID riid, LPVOID *ppvObj)
|
static HRESULT WINAPI IExtractIconA_fnQueryInterface(IExtractIconA * iface, REFIID riid,
|
||||||
|
void **ppv)
|
||||||
{
|
{
|
||||||
IExtractIconW *This = impl_from_IExtractIconA(iface);
|
IExtractIconWImpl *This = impl_from_IExtractIconA(iface);
|
||||||
|
|
||||||
return IExtractIconW_QueryInterface(This, riid, ppvObj);
|
return IExtractIconW_QueryInterface(&This->IExtractIconW_iface, riid, ppv);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* IExtractIconA_AddRef
|
* IExtractIconA::AddRef
|
||||||
*/
|
*/
|
||||||
static ULONG WINAPI IExtractIconA_fnAddRef(IExtractIconA * iface)
|
static ULONG WINAPI IExtractIconA_fnAddRef(IExtractIconA * iface)
|
||||||
{
|
{
|
||||||
IExtractIconW *This = impl_from_IExtractIconA(iface);
|
IExtractIconWImpl *This = impl_from_IExtractIconA(iface);
|
||||||
|
|
||||||
return IExtractIconW_AddRef(This);
|
return IExtractIconW_AddRef(&This->IExtractIconW_iface);
|
||||||
}
|
}
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* IExtractIconA_Release
|
* IExtractIconA::Release
|
||||||
*/
|
*/
|
||||||
static ULONG WINAPI IExtractIconA_fnRelease(IExtractIconA * iface)
|
static ULONG WINAPI IExtractIconA_fnRelease(IExtractIconA * iface)
|
||||||
{
|
{
|
||||||
IExtractIconW *This = impl_from_IExtractIconA(iface);
|
IExtractIconWImpl *This = impl_from_IExtractIconA(iface);
|
||||||
|
|
||||||
return IExtractIconW_Release(This);
|
return IExtractIconW_Release(&This->IExtractIconW_iface);
|
||||||
}
|
}
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* IExtractIconA_GetIconLocation
|
* IExtractIconA::GetIconLocation
|
||||||
*
|
*
|
||||||
* mapping filetype to icon
|
* mapping filetype to icon
|
||||||
*/
|
*/
|
||||||
static HRESULT WINAPI IExtractIconA_fnGetIconLocation(
|
static HRESULT WINAPI IExtractIconA_fnGetIconLocation(IExtractIconA * iface, UINT uFlags,
|
||||||
IExtractIconA * iface,
|
LPSTR szIconFile, UINT cchMax, int * piIndex, UINT * pwFlags)
|
||||||
UINT uFlags,
|
|
||||||
LPSTR szIconFile,
|
|
||||||
UINT cchMax,
|
|
||||||
int * piIndex,
|
|
||||||
UINT * pwFlags)
|
|
||||||
{
|
{
|
||||||
|
IExtractIconWImpl *This = impl_from_IExtractIconA(iface);
|
||||||
HRESULT ret;
|
HRESULT ret;
|
||||||
LPWSTR lpwstrFile = HeapAlloc(GetProcessHeap(), 0, cchMax * sizeof(WCHAR));
|
LPWSTR lpwstrFile = HeapAlloc(GetProcessHeap(), 0, cchMax * sizeof(WCHAR));
|
||||||
IExtractIconW *This = impl_from_IExtractIconA(iface);
|
|
||||||
|
|
||||||
TRACE("(%p) (flags=%u %p %u %p %p)\n", This, uFlags, szIconFile, cchMax, piIndex, pwFlags);
|
TRACE("(%p) (flags=%u %p %u %p %p)\n", This, uFlags, szIconFile, cchMax, piIndex, pwFlags);
|
||||||
|
|
||||||
ret = IExtractIconW_GetIconLocation(This, uFlags, lpwstrFile, cchMax, piIndex, pwFlags);
|
ret = IExtractIconW_GetIconLocation(&This->IExtractIconW_iface, uFlags, lpwstrFile, cchMax,
|
||||||
|
piIndex, pwFlags);
|
||||||
WideCharToMultiByte(CP_ACP, 0, lpwstrFile, -1, szIconFile, cchMax, NULL, NULL);
|
WideCharToMultiByte(CP_ACP, 0, lpwstrFile, -1, szIconFile, cchMax, NULL, NULL);
|
||||||
HeapFree(GetProcessHeap(), 0, lpwstrFile);
|
HeapFree(GetProcessHeap(), 0, lpwstrFile);
|
||||||
|
|
||||||
|
@ -469,19 +466,21 @@ static HRESULT WINAPI IExtractIconA_fnGetIconLocation(
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* IExtractIconA_Extract
|
* IExtractIconA::Extract
|
||||||
*/
|
*/
|
||||||
static HRESULT WINAPI IExtractIconA_fnExtract(IExtractIconA * iface, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize)
|
static HRESULT WINAPI IExtractIconA_fnExtract(IExtractIconA * iface, LPCSTR pszFile,
|
||||||
|
UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize)
|
||||||
{
|
{
|
||||||
|
IExtractIconWImpl *This = impl_from_IExtractIconA(iface);
|
||||||
HRESULT ret;
|
HRESULT ret;
|
||||||
INT len = MultiByteToWideChar(CP_ACP, 0, pszFile, -1, NULL, 0);
|
INT len = MultiByteToWideChar(CP_ACP, 0, pszFile, -1, NULL, 0);
|
||||||
LPWSTR lpwstrFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
|
LPWSTR lpwstrFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
|
||||||
IExtractIconW *This = impl_from_IExtractIconA(iface);
|
|
||||||
|
|
||||||
TRACE("(%p) (file=%p index=%u %p %p size=%u)\n", This, pszFile, nIconIndex, phiconLarge, phiconSmall, nIconSize);
|
TRACE("(%p) (file=%p index=%u %p %p size=%u)\n", This, pszFile, nIconIndex, phiconLarge, phiconSmall, nIconSize);
|
||||||
|
|
||||||
MultiByteToWideChar(CP_ACP, 0, pszFile, -1, lpwstrFile, len);
|
MultiByteToWideChar(CP_ACP, 0, pszFile, -1, lpwstrFile, len);
|
||||||
ret = IExtractIconW_Extract(This, lpwstrFile, nIconIndex, phiconLarge, phiconSmall, nIconSize);
|
ret = IExtractIconW_Extract(&This->IExtractIconW_iface, lpwstrFile, nIconIndex, phiconLarge,
|
||||||
|
phiconSmall, nIconSize);
|
||||||
HeapFree(GetProcessHeap(), 0, lpwstrFile);
|
HeapFree(GetProcessHeap(), 0, lpwstrFile);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue