119 lines
3.3 KiB
C++
119 lines
3.3 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1999 - 1999
|
||
|
//
|
||
|
// File: extract.cpp
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
// ExtractIcon.cpp : Implementation of CExtractIcon
|
||
|
#include "stdafx.h"
|
||
|
#include "shlobj.h"
|
||
|
#include "Extract.h"
|
||
|
#include "xmlfile.h"
|
||
|
|
||
|
/* 7A80E4A8-8005-11D2-BCF8-00C04F72C717 */
|
||
|
CLSID CLSID_ExtractIcon = {0x7a80e4a8, 0x8005, 0x11d2, {0xbc, 0xf8, 0x00, 0xc0, 0x4f, 0x72, 0xc7, 0x17} };
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CExtractIcon
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CExtractIcon::Extract(LPCTSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
int nLargeIconSize = LOWORD(nIconSize);
|
||
|
int nSmallIconSize = HIWORD(nIconSize);
|
||
|
|
||
|
// extract from the .msc file ONLY if the file is in local storage, NOT in offline storage.
|
||
|
DWORD dwFileAttributes = GetFileAttributes(pszFile);
|
||
|
bool bUseMSCFile = (dwFileAttributes != 0xFFFFFFFF) && !(dwFileAttributes & FILE_ATTRIBUTE_OFFLINE);
|
||
|
|
||
|
CSmartIcon iconLarge;
|
||
|
CSmartIcon iconSmall;
|
||
|
|
||
|
if (bUseMSCFile)
|
||
|
{
|
||
|
CPersistableIcon persistableIcon;
|
||
|
|
||
|
// try to read file as if it was XML document first,
|
||
|
hr = ExtractIconFromXMLFile (pszFile, persistableIcon);
|
||
|
|
||
|
// if it fails, assume the file has older MSC format (compound document)
|
||
|
// and try to read it
|
||
|
if (FAILED (hr))
|
||
|
{
|
||
|
USES_CONVERSION;
|
||
|
hr = persistableIcon.Load (T2CW (pszFile));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* get the large and small icons; if either of these fail,
|
||
|
* we'll get default icons below
|
||
|
*/
|
||
|
if (SUCCEEDED (hr) &&
|
||
|
SUCCEEDED (hr = persistableIcon.GetIcon (nLargeIconSize, iconLarge)) &&
|
||
|
SUCCEEDED (hr = persistableIcon.GetIcon (nSmallIconSize, iconSmall)))
|
||
|
{
|
||
|
ASSERT ((iconLarge != NULL) && (iconSmall != NULL));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* use the default icons if the file is offline, or the Load failed
|
||
|
*/
|
||
|
if (!bUseMSCFile || FAILED(hr))
|
||
|
{
|
||
|
/*
|
||
|
* load the large and small icons from our resources
|
||
|
*/
|
||
|
iconLarge.Attach ((HICON) LoadImage (_Module.GetModuleInstance(),
|
||
|
MAKEINTRESOURCE(IDR_MAINFRAME),
|
||
|
IMAGE_ICON,
|
||
|
nLargeIconSize,
|
||
|
nLargeIconSize,
|
||
|
LR_DEFAULTCOLOR));
|
||
|
|
||
|
iconSmall.Attach ((HICON) LoadImage (_Module.GetModuleInstance(),
|
||
|
MAKEINTRESOURCE(IDR_MAINFRAME),
|
||
|
IMAGE_ICON,
|
||
|
nSmallIconSize,
|
||
|
nSmallIconSize,
|
||
|
LR_DEFAULTCOLOR));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* if we successfully got the large and small icons, return them
|
||
|
* to the shell (which will take responsibility for their destruction)
|
||
|
*/
|
||
|
if ((iconLarge != NULL) && (iconSmall != NULL))
|
||
|
{
|
||
|
*phiconLarge = iconLarge.Detach();
|
||
|
*phiconSmall = iconSmall.Detach();
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
else
|
||
|
hr = E_FAIL;
|
||
|
|
||
|
return (hr);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CExtractIcon::GetIconLocation(UINT uFlags, LPTSTR szIconFile, UINT cchMax, LPINT piIndex, UINT *pwFlags)
|
||
|
{
|
||
|
_tcscpy(szIconFile, (LPCTSTR)m_strIconFile);
|
||
|
*piIndex = 0;
|
||
|
*pwFlags = GIL_NOTFILENAME | GIL_PERINSTANCE | GIL_DONTCACHE;
|
||
|
|
||
|
return NOERROR;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CExtractIcon::Load(LPCOLESTR pszFileName, DWORD dwMode)
|
||
|
{
|
||
|
m_strIconFile = pszFileName;
|
||
|
return S_OK;
|
||
|
}
|