使用Delphi 2009,试图制作一个启动器。 为了使它“活泼”,我真的很想在后台线程中加载图标。在Delphi中加载图标
我已经用在这里找到了解决办法: Can 48x48 or 64x64 icons be obtained from the Vista Shell?
这工作得很好,如果不是在一个线程中运行。 只要我把它放在一个线程中,一些图标就不会被“提取”,或者是某种通用图标。 我甚至尝试序列化线程(使它们obsolote,实际上),但它产生相同的结果。
所以,问题是: 如何在线程中加载图标(与链接示例具有相同的可用选项)?
/拉尔斯
编辑: 增加了一些非常基本的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;
此不作任何diffenrence。 我仍然得到了一些通用的图标(只有当这种被称为一个线程,虽然)
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;
显示你得到的沙发,所以我们可以帮助... – whosrdaddy 2012-07-09 11:38:51
那么,没有太多显示。我有链接示例中的过程。我尝试了不同的线程方法,但每个人都给出相同的(错误的)结果。 – 2012-07-09 12:22:45
api调用返回了哪些错误?你是否初始化COM? – 2012-07-09 12:24:17