Потоковая загрузка иконок в Delphi
Используя Delphi 2009, пытаюсь сделать лаунчер. Чтобы сделать его "мгновенным" Я бы очень хотел загрузить иконки в фоновом потоке.
Я использовал решение, найденное здесь: Можно ли получить значки 48x48 или 64x64 в оболочке Vista?
Это прекрасно работает, если НЕ работает в потоке. Как только я помещаю это в поток, некоторые значки не «извлекаются» или являются некими общими значками. Я даже пытался сериализовать потоки (по сути, делая их устаревшими), но это дает те же результаты.
Итак, вопрос в следующем: Как загрузить значки (с такими же доступными опциями, как в связанном примере) в ветке?
/ Lars
Редактировать: Добавлена базовая проверка ошибок в GetIconFromFile
if SHGetFileInfo( PChar( aFile ),
FILE_ATTRIBUTE_NORMAL,
SFI,
SizeOf( TSHFileInfo ),
SHGFI_ICON
or SHGFI_LARGEICON
or SHGFI_SHELLICONSIZE
or SHGFI_SYSICONINDEX
or SHGFI_TYPENAME
or SHGFI_DISPLAYNAME ) <> 0 then
begin
if not Assigned( aIcon ) then
aIcon := TIcon.Create;
aImgList := GetImageListSH( SHIL_FLAG );
aIndex := SFI.iIcon;
if aImgList <> 0 then
aIcon.Handle := ImageList_GetIcon( aImgList, aIndex, ILD_NORMAL );
end;
Это не создает никакой разницы. Я все еще получаю некоторые общие иконки (только когда это вызывается в потоке, хотя)
Edit2: Потоковый код (очень простой):
procedure TIconLoader.Execute;
var
Item : TGridItem;
I : TIcon;
begin
inherited;
while not terminated do
begin
Item := nil;
if assigned(FOnNeedGridItem) then
begin
Synchronize(
procedure
begin
FOnNeedGridItem(Self, Item);
end
);
end;
if assigned(Item) then
begin
GetIconFromFile(Item.FFilename, I, SHIL_EXTRALARGE);
Synchronize(
procedure
begin
Item.SetIcon(I);
end
);
// I.Free;
end
else
Terminate;
end;
end;