Проблема Delphi7 CustomImageList - PullRequest
       27

Проблема Delphi7 CustomImageList

2 голосов
/ 28 октября 2010

Я столкнулся со следующей проблемой:

Моя программа 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 голосов
/ 28 октября 2010

Одна вещь, которую вы могли бы попробовать, это загрузить ваш значок в отдельный tBitmap, а затем изменить его размер перед добавлением в список изображений.

...