これは、私の別の質問のちょっとした拡張です。Double
およびPChar
. _
Double
ゲーム・メーカーとやり取りするには、オブジェクトを s (参照) に変換する必要があります。
と の 2 つのクラスがTBitmap
ありTWindow
ます。それぞれ実装してIBlittable
います。これは、IBlittable
s を操作するメソッドが両方を使用できることを意味しますが、ここに問題があります。
作成方法は次のとおりです。
{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) にキャストすると、正常に動作します。この問題を回避するにはどうすればよいですか?
私は本当にすべてのメソッドを具体的に書き直したくありません(それはかなり冗長で不自由になるでしょう)