Lazarus. Использование GDI+. Access Violation

Рейтинг: 1Ответов: 0Опубликовано: 12.04.2023

Занимаюсь переносом приложения из Delphi на Lazarus. Возникла проблема со следующим участком кода:

uses GDIPAPI, GDIPOBJ;
...
var ist:IStream;
    ms:TMemoryStream;
    img:TGPImage;
begin
    ...
    //загрузка из БД blob поля в поток
    (DS.FieldByName('IMAGE') as TBlobField).SaveToStream(ms);
    //создание TGPImage
    ms.Position:=0;
    ist:=TStreamAdapter.Create(ms);
    img:=TGPImage.Create(ist); // на этой строке возникает исключение
    ...
end;

Проблема заключается в выдаче исключения External: Access Violation... Write of address 00000000.

Конструктор TGPImage:

constructor TGPImage.Create(stream: IStream;
  useEmbeddedColorManagement: BOOL = FALSE);
begin
  nativeImage := nil;
  if (useEmbeddedColorManagement) then
    lastResult := GdipLoadImageFromStreamICM(stream, nativeImage)
  else lastResult := GdipLoadImageFromStream(stream, nativeImage);
end;

Модули GDIPAPI, GDIPOBJ идентичны для Delphi и Lazarus, за исключением строки

{$IFDEF FPC} {$MODE Delphi} {$ENDIF}

в модулях для Lazarus.

Для потока ms, ms.Size в делфи = ms.Size в Lazarus для отдельно взятой записи БД. Интересно, что если написать ms.Position:=1; то исключение не выдается, ну и в img понятное дело мусор.

У кого какие соображения как справиться с проблемой?

Ответы

Ответов пока нет.