【问题标题】:Pascal: Interfaced Class, to Double, to Interface instancePascal:Interfaced Class, to Double, to Interface instance
【发布时间】:2013-06-11 15:15:33
【问题描述】:

这是对我的另一个问题的扩展。我有一个应该与 Game Maker 接口的 DLL,它使用 DoublePChar

我必须将我的对象转换为 Doubles(引用)才能与 Game Maker 来回传递。

我有 2 个课程:TBitmapTWindow。每个实现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 时,它​​会出现段错误并崩溃。

当我将它转换为以前的状态(TWindow 或 TBitmap)时,它可以正常工作。我该如何规避这个问题?

我真的不想专门重写所有方法(那会非常多余和蹩脚)

【问题讨论】:

  • 为什么要将指针存储在 doubles 中?这根本没有意义。特别是使用 floor,double 只有 53 位精度,所以它永远不会在具有 64 位精度的 64 位系统上工作。另外,您使用的是 CORBA 还是 COM 接口?
  • @BeniBela Game Maker 是一款可以使用 DLL 进行扩展的软件。它只使用Doubles 与DLL 通信,所以我不得不使用它们。它也保证是 32 位的。相当老套和愚蠢,不是吗?

标签: class pointers interface freepascal


【解决方案1】:

我需要更改创建函数中的类型:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2014-05-17
    • 2022-12-27
    相关资源
    最近更新 更多