1

下記の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 

exe pasファイル内で同じ関数(ResizeImg)を定義して使用すると、エラーなしで完全に正常に動作します。

4

1 に答える 1

3

モジュールが同じランタイムとメモリアロケータを共有するようにする手順を実行しない限り、モジュール間でDelphiオブジェクトを渡すことはできません。Irはあなたがそのような措置を講じていないようです。

基本的な問題は、Delphiオブジェクトがデータとコードの両方であるということです。別のモジュールで作成されたオブジェクトのメソッドを単純に呼び出す場合は、そのモジュールのデータに対してこのモジュールのコードを実行します。これは通常、ランタイムエラーで終了します。

少なくとも次のオプションがあります。

  1. ランタイムパッケージを使用します。これにより、共有ランタイムが適用されます。
  2. COM相互運用機能を使用します。COMは、モジュールの境界を越えてコンポーネントを共有するために設計されました。
  3. すべてのコードを単一の実行可能ファイルにリンクします。
  4. モジュール間でHBITMAPを渡すのは、そのような方法で共有できるためです。
于 2011-09-19T08:44:51.037 に答える