0

これは、私の別の質問のちょっとした拡張です。DoubleおよびPChar. _

Doubleゲーム・メーカーとやり取りするには、オブジェクトを s (参照) に変換する必要があります。

と の 2 つのクラスがTBitmapありTWindowます。それぞれ実装してIBlittableいます。これは、IBlittables を操作するメソッドが両方を使用できることを意味しますが、ここに問題があります。

作成方法は次のとおりです。

{Creation of Bitmaps and Windows}

function CreateBitmap(W, H: Double): Double; STDCall;
var
  TBM: TBitmap;
begin
  TBM := TBitmap.Create(Floor(W), Floor(H));
  CreateBitmap := Double(Integer(TBM));
end;

function GetWindowByHWND(Handle: Double): Double; STDCall;
var
  ReturnVal: TWindow;
begin
  ReturnVal := TWindow.Create(Floor(Handle));
  GetWindowByHWND := Double(Integer(ReturnVal));
end;

そして、これが私がそれらを操作しようとしている方法です:

function SetPixel(Handle, X, Y, Color: Double): Double; STDCall;
var
  <stuff>
begin
  Blittable := IBlittable(Floor(Handle)); //This!
  <set the pixel>
  SetPixel := 0;
end;

Floor(Handle)を IBlittableにキャストすると、segfault が発生してクラッシュします。

以前のもの (TWindow または TBitmap) にキャストすると、正常に動作します。この問題を回避するにはどうすればよいですか?

私は本当にすべてのメソッドを具体的に書き直したくありません(それはかなり冗長で不自由になるでしょう)

4

1 に答える 1

0

作成関数の型を変更する必要がありました。

function CreateBitmap(W, H: Double): Double; STDCall;
var
  TBM: IBlittable; //See
begin
  TBM := TBitmap.Create(Floor(W), Floor(H));
  CreateBitmap := Double(Integer(TBM));
end;

function GetWindowByHWND(Handle: Double): Double; STDCall;
var
  ReturnVal: IBlittable; //Here too
begin
  ReturnVal := TWindow.Create(Floor(Handle));
  GetWindowByHWND := Double(Integer(ReturnVal));
end;
于 2013-06-12T02:45:10.600 に答える