Delphi中的图标螺纹加载

Delphi中的图标螺纹加载,第1张

概述使用Delphi 2009,试图制作一个启动器. 为了使它“快速”,我真的想在后台线程中加载图标. 我使用过这里找到的解决方案: Can 48×48 or 64×64 icons be obtained from the Vista Shell? 如果不在线程中运行,这可以正常工作. 一旦我把它放在一个线程中,一些图标就不会被“获取”,或者是某种通用图标. 我甚至尝试将线程序列化(使它们无效,但实 使用Delphi 2009,试图制作一个启动器.
为了使它“快速”,我真的想在后台线程中加载图标.

我使用过这里找到的解决方案:
Can 48×48 or 64×64 icons be obtained from the Vista Shell?

如果不在线程中运行,这可以正常工作.
一旦我把它放在一个线程中,一些图标就不会被“获取”,或者是某种通用图标.
我甚至尝试将线程序列化(使它们无效,但实际上却产生了阻塞),但它产生了相同的结果.

所以,问题是:
如何在线程中加载图标(与链接示例具有相同的可用选项)?

/拉尔斯

编辑:
在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 thenbegin  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;

这并没有任何不同之处.
我仍然得到一些通用图标(只有在线程中调用它时)

编辑2:
线程代码(非常简单):

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;
解决方法 SHGetfileInfo的文档指定在调用函数之前必须初始化COM.由于COM初始化是每个线程,因此需要在线程中初始化COM.这意味着从线程的Execute方法调用CoInitialize或CoInitializeEx. 总结

以上是内存溢出为你收集整理的Delphi中的图标螺纹加载全部内容,希望文章能够帮你解决Delphi中的图标螺纹加载所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1234044.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存