Слои оверлея
Добавлено: Сб ноя 28, 2009 12:07 am
Разыскивается код на Delphi/C++Builder, позволяющий получить у системы оверлейные слои значков. Буду очень признателен за конкретную помощь по данному вопросу.
Виртуальный форум по нереальному файловому менеджеру
http://forum.unrealcommander.net/
Код: Выделить всё
uses
ActiveX, ShlObj, ShLwApi, CommCtrl;
const
IID_IShellIconOverlay: TGUID = (
D1:$7D688A70; D2:$C613; D3:$11D0; D4:($99, $9B, $00, $C0, $4F, $D6, $55, $E1));
IID_IShellIconOverlayManager: TGUID = (
D1:$F10B5E34; D2:$DD3B; D3:$42A7; D4:($AA, $7D, $2F, $4E, $C5, $4B, $B0, $9B));
CLSID_CFSIconOverlayManager: TGUID = (
D1:$63B51F81; D2:$C868; D3:$11D0; D4:($99, $9C, $00, $C0, $4F, $D6, $55, $E1));
type
IShellIconOverlayManager = interface
['{F10B5E34-DD3B-42A7-AA7D-2F4EC54BB09B}']
function GetFileOverlayInfo(pwszPath: LPCWSTR; dwAttrib: DWORD;
var iIndex: Integer; dwFlags: DWORD): HRESULT; stdcall;
function GetReservedOverlayInfo(pwszPath: LPCWSTR; dwAttrib: DWORD;
var iIndex: Integer; dwFlags: DWORD; iReservedID: Integer): HRESULT; stdcall;
function RefreshOverlayImages(dwFlags: DWORD): HRESULT; stdcall;
function LoadNonloadedOverlayIdentifiers(): HRESULT; stdcall;
function OverlayIndexFromImageIndex(iImage: Integer;
var iIndex: Integer; fAdd: BOOL): HRESULT; stdcall;
end;
const
SIOM_OVERLAYINDEX = 1;
SIOM_ICONINDEX = 2;
SIOM_RESERVED_SHARED = 0;
SIOM_RESERVED_LINK = 1;
SIOM_RESERVED_SLOWFILE = 2;
const
SHGFI_ICON = $000000100;
SHGFI_DISPLAYNAME = $000000200;
SHGFI_TYPENAME = $000000400;
SHGFI_ATTRIBUTES = $000000800;
SHGFI_ICONLOCATION = $000001000;
SHGFI_EXETYPE = $000002000;
SHGFI_SYSICONINDEX = $000004000;
SHGFI_LINKOVERLAY = $000008000;
SHGFI_SELECTED = $000010000;
SHGFI_LARGEICON = $000000000;
SHGFI_SMALLICON = $000000001;
SHGFI_OPENICON = $000000002;
SHGFI_SHELLICONSIZE = $000000004;
SHGFI_PIDL = $000000008;
SHGFI_USEFILEATTRIBUTES = $000000010;
SHGFI_ADDOVERLAYS = $000000020;
SHGFI_OVERLAYINDEX = $000000040;
type
_SHFILEINFOW = packed record
hIcon: HICON;
iIcon: Integer;
dwAttributes: DWORD;
szDisplayName: array [0..MAX_PATH-1] of WideChar;
szTypeName: array [0..79] of WideChar;
end;
function SHGetFileInfoW(pszPath: LPCWSTR; dwFileAttributes: DWORD;
var psfi: _SHFILEINFOW; cbFileInfo, uFlags: UINT): DWORD; stdcall; external 'SHELL32.DLL';
function QueryShlObjIconOverlayIndex(filePath: PWideChar; var iIndex: Integer): Boolean;
var
pathBuf: PWideChar;
desktopFolder, folder: IShellFolder;
folderID, fileID: PItemIDList;
shellIconOverlay: IShellIconOverlay;
overlayIndex, overlayIconIndex: Integer;
begin
Result := False;
iIndex := -1;
if not PathFileExistsW(filePath) then Exit;
GetMem(pathBuf, (lstrlenW(filePath) + 1) shl 1);
try
lstrcpyW(pathBuf, filePath);
StrTrimW(pathBuf, '\');
PathRemoveFileSpecW(pathBuf);
SHGetDesktopFolder(desktopFolder);
if not Assigned(desktopFolder) then Exit;
try
desktopFolder.ParseDisplayName(0, nil,
pathBuf, PULONG(nil)^, folderID, PULONG(nil)^);
if not Assigned(folderID) then Exit;
try
desktopFolder.BindToObject(folderID, nil, IID_IShellFolder, folder);
if not Assigned(folder) then Exit;
try
lstrcpyW(pathBuf, PathFindFileNameW(filePath));
StrTrimW(pathBuf, '\');
folder.ParseDisplayName(0, nil,
pathBuf, PULONG(nil)^, fileID, PULONG(nil)^);
if not Assigned(fileID) then Exit;
try
folder.QueryInterface(IID_IShellIconOverlay, shellIconOverlay);
if not Assigned(shellIconOverlay) then Exit;
try
shellIconOverlay.GetOverlayIndex(fileID, overlayIndex);
shellIconOverlay.GetOverlayIconIndex(fileID, overlayIconIndex);
if (overlayIndex >= overlayIconIndex) then
iIndex := overlayIndex - 1
else
iIndex := overlayIconIndex;
finally
shellIconOverlay := nil;
end;
finally
CoTaskMemFree(fileID);
end;
finally
folder := nil;
end;
finally
CoTaskMemFree(folderID);
end;
finally
desktopFolder := nil;
end;
finally
FreeMem(pathBuf);
end;
Result := True;
end;
function QueryReservedIconOverlayIndex(iReservedID: Integer; var iIndex: Integer): Boolean;
var
shellIconOverlayManager: IShellIconOverlayManager;
begin
Result := False;
CoCreateInstance(CLSID_CFSIconOverlayManager, nil,
CLSCTX_INPROC_SERVER, IID_IShellIconOverlayManager, shellIconOverlayManager);
if not Assigned(shellIconOverlayManager) then Exit;
try
shellIconOverlayManager.GetReservedOverlayInfo(nil, 0, iIndex, SIOM_ICONINDEX, iReservedID);
finally
shellIconOverlayManager := nil;
end;
Result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
filePath: WideString;
shfi: _SHFILEINFOW;
hImgList: integer;
overlayIndex: Integer;
begin
filePath := StringToOleStr(Edit1.Text);
FillChar(shfi, SizeOf(shfi), 0);
hImgList := SHGetFileInfoW(PWideChar(filePath), 0,
shfi, SizeOf(shfi), SHGFI_SMALLICON or SHGFI_SYSICONINDEX or SHGFI_ATTRIBUTES);
QueryShlObjIconOverlayIndex(PWideChar(filePath), overlayIndex);
if (overlayIndex < 0) and (shfi.dwAttributes and SFGAO_SHARE <> 0) then
QueryReservedIconOverlayIndex(SIOM_RESERVED_SHARED, overlayIndex);
Refresh();
ImageList_Draw(hImgList, shfi.iIcon, Canvas.Handle, 200, 100, ILD_TRANSPARENT);
ImageList_Draw(hImgList, overlayIndex, Canvas.Handle, 200, 100, ILD_TRANSPARENT);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
FileInitIcons(True);
end;