Carga roscada de iconos en Delphi

Usando Delphi 2009, intentando hacer un lanzador. Para hacerlo "ágil" realmente me gustaría cargar íconos en un hilo de fondo.

He usado la solución encontrada aquí:¿Se pueden obtener íconos de 48x48 o 64x64 de Vista Shell?

Esto funciona bien, si no se ejecuta en un hilo. Tan pronto como lo coloco en un hilo, algunos íconos no se "captan", o son algún tipo de ícono genérico. Incluso intenté serializar los hilos (haciéndolos obsoletos, en efecto) pero produce los mismos resultados.

Entonces, la pregunta es: ¿Cómo puedo cargar íconos (con las mismas opciones disponibles que el ejemplo vinculado) en un hilo?

/ Lars

Edición: Se agregó una comprobación de errores muy básica en 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;

Esto no hace ninguna diferencia. Todavía estoy recibiendo algunos iconos genéricos (solo cuando esto se llama en un hilo, sin embargo)

Edit2: Threading-code (muy simple):

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;

Respuestas a la pregunta(3)

Su respuesta a la pregunta