I have same problem time ago. LCL seems can't have full alpha support for TIcon, so you must use another similar component. I tried TKIcon and it works. You can find here http://www.tkweb.eu/en/delphicomp/kicon.html
I post a sample procedure to extract a icon. It is very simple.
procedure ExtractIconAndSave(xpath: string);
var
FileInfo: SHFILEINFO;
Icon: KIcon.TIcon; //Don't confused with Graphics.TIcon
begin
//Get icon handle
SHGetFileInfo(PChar(xpath), 0, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_ICON or SHGFI_LARGEICON);
//Check if SHGetFileInfo get the icon handle
if FileInfo.hIcon <> 0 then
begin
//Use kIcon's TIcon - It supports alpha 32bpp
Icon := KIcon.TIcon.Create;
try
//Load icon handle in TKIcon and save it in a file
Icon.LoadFromHandle(FileInfo.hIcon);
Icon.SaveToFile('extracted.ico');
finally
DestroyIcon(FileInfo.hIcon);
FreeAndNil(Icon);
end;
end;
end;