80 lines
1.9 KiB
C++
80 lines
1.9 KiB
C++
|
#include "shellprv.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include "xiconwrap.h"
|
||
|
|
||
|
// IUnknown
|
||
|
STDMETHODIMP CExtractIconBase::QueryInterface(REFIID riid, void** ppv)
|
||
|
{
|
||
|
static const QITAB qit[] =
|
||
|
{
|
||
|
QITABENT(CExtractIconBase, IExtractIconA),
|
||
|
QITABENT(CExtractIconBase, IExtractIconW),
|
||
|
{ 0 },
|
||
|
};
|
||
|
|
||
|
return QISearch(this, qit, riid, ppv);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP_(ULONG) CExtractIconBase::AddRef()
|
||
|
{
|
||
|
return InterlockedIncrement(&_cRef);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP_(ULONG) CExtractIconBase::Release()
|
||
|
{
|
||
|
if (InterlockedDecrement(&_cRef))
|
||
|
return _cRef;
|
||
|
|
||
|
delete this;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
CExtractIconBase::CExtractIconBase() : _cRef(1)
|
||
|
{
|
||
|
DllAddRef();
|
||
|
}
|
||
|
|
||
|
CExtractIconBase::~CExtractIconBase()
|
||
|
{
|
||
|
DllRelease();
|
||
|
}
|
||
|
|
||
|
// IExtractIconA
|
||
|
STDMETHODIMP CExtractIconBase::GetIconLocation(UINT uFlags,
|
||
|
LPSTR pszIconFile, UINT cchMax, int* piIndex, UINT* pwFlags)
|
||
|
{
|
||
|
WCHAR sz[MAX_PATH];
|
||
|
HRESULT hr = _GetIconLocationW(uFlags, sz, ARRAYSIZE(sz), piIndex, pwFlags);
|
||
|
if (S_OK == hr)
|
||
|
{
|
||
|
// We don't want to copy the icon file name on the S_FALSE case
|
||
|
SHUnicodeToAnsi(sz, pszIconFile, cchMax);
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CExtractIconBase::Extract(LPCSTR pszFile, UINT nIconIndex,
|
||
|
HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize)
|
||
|
{
|
||
|
WCHAR sz[MAX_PATH];
|
||
|
|
||
|
SHAnsiToUnicode(pszFile, sz, ARRAYSIZE(sz));
|
||
|
return _ExtractW(sz, nIconIndex, phiconLarge, phiconSmall, nIconSize);
|
||
|
}
|
||
|
|
||
|
// IExtractIconW
|
||
|
STDMETHODIMP CExtractIconBase::GetIconLocation(UINT uFlags,
|
||
|
LPWSTR pszIconFile, UINT cchMax, int* piIndex, UINT* pwFlags)
|
||
|
{
|
||
|
return _GetIconLocationW(uFlags, pszIconFile, cchMax, piIndex, pwFlags);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CExtractIconBase::Extract(LPCWSTR pszFile, UINT nIconIndex,
|
||
|
HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize)
|
||
|
{
|
||
|
return _ExtractW(pszFile, nIconIndex, phiconLarge, phiconSmall, nIconSize);
|
||
|
}
|
||
|
|