Функция ExtractIconEx

Рейтинг: 0Ответов: 1Опубликовано: 10.10.2014

Добрый день, уважаемые программисты! Написал процедуру для извлечения иконок. Всё работает, но не смог до конца разобраться с функцией:

ExtractIconEx

Конкретно меня интересует, каким должен быть массив

WideChars: array[0..1000] of WideChar;

var Minicon: array[1..500] of TIcon;
    Maxicon: array[1..500] of TIcon;

procedure LoadIcons(fname: String; lgImages, smImages: TImageList);
var smIconHandle, lgIconHandle: HICON;
    i: integer;
    WideChars: array[0..1000] of WideChar;    {поставил 1000, потому что при малых значениях выдает ошибку}
begin
  i:=0;
  while Integer(ExtractIconEx(StringToWideChar(fname, WideChars, Length(fname)+1),i,lgIconHandle,smIconHandle,1))>0 do
  begin
    inc(i);
    maxicon[i]:=TIcon.Create;
    maxicon[i].Handle:=lgIconHandle;
    lgImages.AddIcon(maxicon[i]);

    minicon[i]:=TIcon.Create;
    minicon[i].Handle:=smIconHandle;
    smImages.AddIcon(minicon[i]);
  end;
end;

Ответы

▲ 1

Это вы не разобрались с функцией StringToWideChar, а не ExtractIconEx. Массив WideChars (буфер) должен быть достаточного размера, чтобы туда влезла ваша строка fname. Должно быть как-то так:

var
  WideChars: array of WideChar;
begin
  SetLength(WideChars, Length(fname) + SizeOf(WideChar)); // на один символ больше для "terminated by a NULL wide character"
  StringToWideChar(fname, WideChars, Length(WideChars));

Хотя функция эта вам не нужна, делайте так:

ExtractIconEx(PChar(fname), i, lgIconHandle, smIconHandle, 1)

Не забудьте вызвать DestroyIcon для каждой иконки извлеченной этой функцией.