1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
|
// SysIconUtils.cpp
#include "StdAfx.h"
#ifndef _UNICODE
#include "Common/StringConvert.h"
#endif
#include "SysIconUtils.h"
#ifndef _UNICODE
extern bool g_IsNT;
#endif
#ifdef _WIN32
int GetIconIndexForCSIDL(int csidl)
{
LPITEMIDLIST pidl = 0;
SHGetSpecialFolderLocation(NULL, csidl, &pidl);
if (pidl)
{
SHFILEINFO shellInfo;
SHGetFileInfo(LPCTSTR(pidl), FILE_ATTRIBUTE_NORMAL,
&shellInfo, sizeof(shellInfo),
SHGFI_PIDL | SHGFI_SYSICONINDEX);
IMalloc *pMalloc;
SHGetMalloc(&pMalloc);
if(pMalloc)
{
pMalloc->Free(pidl);
pMalloc->Release();
}
return shellInfo.iIcon;
}
return 0;
}
DWORD_PTR GetRealIconIndex(LPCTSTR path, DWORD attrib, int &iconIndex)
{
SHFILEINFO shellInfo;
DWORD_PTR res = ::SHGetFileInfo(path, FILE_ATTRIBUTE_NORMAL | attrib, &shellInfo,
sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX);
iconIndex = shellInfo.iIcon;
return res;
}
#ifndef _UNICODE
typedef int (WINAPI * SHGetFileInfoWP)(LPCWSTR pszPath, DWORD attrib, SHFILEINFOW *psfi, UINT cbFileInfo, UINT uFlags);
struct CSHGetFileInfoInit
{
SHGetFileInfoWP shGetFileInfoW;
CSHGetFileInfoInit()
{
shGetFileInfoW = (SHGetFileInfoWP)
::GetProcAddress(::GetModuleHandleW(L"shell32.dll"), "SHGetFileInfoW");
}
} g_SHGetFileInfoInit;
#endif
static DWORD_PTR MySHGetFileInfoW(LPCWSTR pszPath, DWORD attrib, SHFILEINFOW *psfi, UINT cbFileInfo, UINT uFlags)
{
#ifdef _UNICODE
return SHGetFileInfo(
#else
if (g_SHGetFileInfoInit.shGetFileInfoW == 0)
return 0;
return g_SHGetFileInfoInit.shGetFileInfoW(
#endif
pszPath, attrib, psfi, cbFileInfo, uFlags);
}
#ifndef _UNICODE
// static inline UINT GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; }
DWORD_PTR GetRealIconIndex(LPCWSTR path, DWORD attrib, int &iconIndex)
{
if(g_IsNT)
{
SHFILEINFOW shellInfo;
DWORD_PTR res = ::MySHGetFileInfoW(path, FILE_ATTRIBUTE_NORMAL | attrib, &shellInfo,
sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX);
iconIndex = shellInfo.iIcon;
return res;
}
else
return GetRealIconIndex(UnicodeStringToMultiByte(path), attrib, iconIndex);
}
#endif
DWORD_PTR GetRealIconIndex(const UString &fileName, DWORD attrib,
int &iconIndex, UString &typeName)
{
#ifndef _UNICODE
if(!g_IsNT)
{
SHFILEINFO shellInfo;
shellInfo.szTypeName[0] = 0;
DWORD_PTR res = ::SHGetFileInfoA(GetSystemString(fileName), FILE_ATTRIBUTE_NORMAL | attrib, &shellInfo,
sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME);
typeName = GetUnicodeString(shellInfo.szTypeName);
iconIndex = shellInfo.iIcon;
return res;
}
else
#endif
{
SHFILEINFOW shellInfo;
shellInfo.szTypeName[0] = 0;
DWORD_PTR res = ::MySHGetFileInfoW(fileName, FILE_ATTRIBUTE_NORMAL | attrib, &shellInfo,
sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME);
typeName = shellInfo.szTypeName;
iconIndex = shellInfo.iIcon;
return res;
}
}
int CExtToIconMap::GetIconIndex(DWORD attrib, const UString &fileName, UString &typeName)
{
int dotPos = fileName.ReverseFind(L'.');
if ((attrib & FILE_ATTRIBUTE_DIRECTORY) != 0 || dotPos < 0)
{
CAttribIconPair pair;
pair.Attrib = attrib;
int index = _attribMap.FindInSorted(pair);
if (index >= 0)
{
typeName = _attribMap[index].TypeName;
return _attribMap[index].IconIndex;
}
GetRealIconIndex(
#ifdef UNDER_CE
L"\\"
#endif
L"__File__"
, attrib, pair.IconIndex, pair.TypeName);
_attribMap.AddToSorted(pair);
typeName = pair.TypeName;
return pair.IconIndex;
}
CExtIconPair pair;
pair.Ext = fileName.Mid(dotPos + 1);
int index = _extMap.FindInSorted(pair);
if (index >= 0)
{
typeName = _extMap[index].TypeName;
return _extMap[index].IconIndex;
}
GetRealIconIndex(fileName.Mid(dotPos), attrib, pair.IconIndex, pair.TypeName);
_extMap.AddToSorted(pair);
typeName = pair.TypeName;
return pair.IconIndex;
}
int CExtToIconMap::GetIconIndex(DWORD attrib, const UString &fileName)
{
UString typeName;
return GetIconIndex(attrib, fileName, typeName);
}
#else
DWORD_PTR GetRealIconIndex(LPCTSTR path, DWORD attrib, int &iconIndex)
{
iconIndex = -1;
return -1;
}
int CExtToIconMap::GetIconIndex(DWORD attrib, const UString &fileName)
{
return -1;
}
#endif
|