Delphi7的CustomImageList问题

时间:2010-10-28 18:10:45

标签: delphi delphi-7 imagelist tpngimagelist

我遇到了以下问题:

我的Delphi7程序在运行WinXP / Vista / 7的大多数计算机上运行顺畅但是在一些较旧的Windows XP安装上(只有少数)我遇到了以下问题:

我有一个系统图像列表,我将自己的图标添加到系统图像列表的副本中。添加我的图标后,我得到“图片大小无效”。 EInvalidOperation错误。

以下是相关代码:

function GetSystemLargeIconsList: TCustomImageList;
// This gets the system image list.
var
  SysIL: HImageList;
  SFI: TSHFileInfo;
  MyImages: TCustomImageList;
begin
  SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI),
     SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
  if SysIL <> 0 then begin
    MyImages:=TCustomImageList.Create(nil);
    // Assign the system list to the component
    MyImages.Handle := SysIL;
 // The following prevents the image list handle from being
 // destroyed when the component is.
    MyImages.ShareImages := TRUE;
    Result:=MyImages;
  end;
end;

var
    DocumentImgList: TCustomImageList;
    IconToAdd: TIcon;
begin
    DocumentImgList:=GetSystemLargeIconsList;

    Documents.LargeImages:=DocumentImgList;
    Documents.SmallImages:=DocumentImgList;

    IconToAdd:=TIcon.Create;

    DocumentListIcons.GetIcon(0, IconToAdd);
    DocumentImgList.AddIcon(IconToAdd); ----> this is the line of the exception

为了使问题更严重,我正在使用TPngImageList组件,但根据代码,它似乎只是调用标准的Delphi函数:

if TObject(Self) is TPngImageList
then if Image = nil

...

else begin
     Patch := FindMethodPatch('AddIcon');
     if Patch <> nil
     then begin
          Patch.BeginInvokeOldMethod;
          try
            Result := TCustomImageList(Self).AddIcon(Image); ----> this is where the exception happens
          finally
            Patch.FinishInvokeOldMethod;
           end;
          end
     else Result := -1;
     end;

我最近发现,在其中一台出现此问题的计算机上,uxtheme.dll或explorer.exe已经修补了一些Windows皮肤程序。

所以我想有人或程序正在以一种让我的Delphi程序崩溃的方式攻击系统映像列表。

有关如何解决此问题的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以尝试的一件事是将图标加载到单独的tBitmap中,然后在将其添加到图像列表中之前调整其大小。