加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi中的图标螺纹加载

发布时间:2020-12-15 09:12:12 所属栏目:大数据 来源:网络整理
导读:使用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 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;

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

编辑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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读