Lazarus. Использование GDI+. Access Violation
Занимаюсь переносом приложения из 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 понятное дело мусор.
У кого какие соображения как справиться с проблемой?
Источник: Stack Overflow на русском