Delphi图标螺纹加载,如何实现长尾词功能?

2026-04-10 18:082阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计456个文字,预计阅读时间需要2分钟。

Delphi图标螺纹加载,如何实现长尾词功能?

使用Delphi 2009,创建一个启动器。为了使其快速,我想在后台线程中加载图标。我在这里找到的解决方案是:可以从Vista Shell获取48x48或64x64图标吗?如果不在程序中运行,怎么办?

使用Delphi 2009,试图制作一个启动器.
为了使它“快速”,我真的想在后台线程中加载图标.

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

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

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

/拉尔斯

编辑:
在GetIconFromFile中添加了一些非常基本的错误检查

Delphi图标螺纹加载,如何实现长尾词功能?

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.

本文共计456个文字,预计阅读时间需要2分钟。

Delphi图标螺纹加载,如何实现长尾词功能?

使用Delphi 2009,创建一个启动器。为了使其快速,我想在后台线程中加载图标。我在这里找到的解决方案是:可以从Vista Shell获取48x48或64x64图标吗?如果不在程序中运行,怎么办?

使用Delphi 2009,试图制作一个启动器.
为了使它“快速”,我真的想在后台线程中加载图标.

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

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

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

/拉尔斯

编辑:
在GetIconFromFile中添加了一些非常基本的错误检查

Delphi图标螺纹加载,如何实现长尾词功能?

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.