Ошибки растягивания изображения Delphi dll

Я пытаюсь изменить размер (масштабировать) растровое изображение, используя функцию dll, которая упоминается ниже.

{ to resize the image }
function ResizeImg(maxWidth,maxHeight: integer;thumbnail : TBitmap): TBitmap;
var
 thumbRect : TRect;
begin
 thumbRect.Left := 0;
 thumbRect.Top := 0;

 if thumbnail.Width > maxWidth then
  begin
   thumbRect.Right := maxWidth;
  end
 else
  begin
    thumbRect.Right := thumbnail.Width;;
  end;

 if thumbnail.Height > maxHeight then
  begin
   thumbRect.Bottom := maxHeight;
  end
 else
  begin
   thumbRect.Bottom := thumbnail.Height;
  end;
 thumbnail.Canvas.StretchDraw(thumbRect, thumbnail) ;

  //resize image
 thumbnail.Width := thumbRect.Right;
 thumbnail.Height := thumbRect.Bottom;

 //display in a TImage control
 Result:= thumbnail;
end;

Он отлично работает, когда я использую этот вызов приложения (для подачи всех изображений в моем списке):

  //bs:TStream; btmap:TBitmap;
  bs := CreateBlobstream(fieldbyname('Picture'),bmRead);
  bs.postion := 0;
  btmap.Loadfromstream(bs);
  ListView1.Items[i].ImageIndex := ImageList1.Add(ResizeImg(60,55,btmap), nil);

Но когда я пытаюсь вызвать этот вызов приложения (чтобы получить отдельное изображение в моем компоненте TImage):

 bs := CreateBlobstream(fieldbyname('Picture'),bmRead);
 bs.postion := 0;
 btmap.Loadfromstream(bs);
 Image1.Picture.Bitmap := ResizeImg(250,190,btmap);

Это дает мне ошибку:

 thumbnail.Canvas.StretchDraw(thumbRect, thumbnail) ;

говоря:

 AV at address 00350422 in module 'mydll.dll' Read of Address 20000027

И когда я закрываю свой исполняемый файл, я получаю это:

 runtime error 216 at 0101C4BA 

Если я определяю и использую ту же функцию (ResizeImg) внутри моего exe-файла pas, она работает совершенно нормально без каких-либо ошибок.


person Shirish11    schedule 19.09.2011    source источник
comment
Эта функция подразумевает возврат совершенно другого TBitmap, но она просто возвращает входной TBitmap. Я предлагаю преобразовать эту рутину в процедуру.   -  person NGLN    schedule 19.09.2011
comment
я не могу использовать для этого процедуру, так как я назначаю результат функции некоторым другим компонентам   -  person Shirish11    schedule 19.09.2011


Ответы (1)


Вы не можете передавать объекты Delphi между модулями, если не предпримете шаги для обеспечения того, чтобы эти модули совместно использовали одну и ту же среду выполнения и распределитель памяти. Похоже, вы не предприняли таких шагов.

Основная проблема заключается в том, что объект Delphi — это и данные, и код. Если вы наивно вызываете метод для объекта, который был создан в другом модуле, вы выполняете код из этого модуля для данных из этого модуля. Обычно это заканчивается ошибками времени выполнения.

У вас есть как минимум следующие варианты:

  1. Используйте пакеты времени выполнения. Это обеспечит общую среду выполнения.
  2. Используйте COM-взаимодействие. COM был разработан для совместного использования компонентов через границы модулей.
  3. Свяжите весь код в один исполняемый файл.
  4. Передавайте HBITMAP между модулями, поскольку таким образом они могут использоваться совместно.
person David Heffernan    schedule 19.09.2011