Delphi DLL изображение растягивать ошибки - PullRequest
1 голос
/ 19 сентября 2011

Я пытаюсь изменить размер (масштабировать) растровое изображение с помощью функции 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файл работает совершенно нормально, без ошибок.

1 Ответ

3 голосов
/ 19 сентября 2011

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

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

У вас есть как минимум следующие опции:

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