どのようにして、クラスのアドレスと変数のオフセットを使ってクラスの値にアクセスできますか?

自分のインスタンスと変数へのオフセットを使用してクラスの厳密なprivate class var 値にアクセスする必要があります。

これまでにこれを試しましたが、このサンプルクラスをチェックしてください

type
  TFoo=class
   strict private class var Foo: Integer;
   public
   constructor Create;
  end;

constructor TFoo.Create;
begin
  inherited;
  Foo:=666;
end;

//this function works only if I declare the foo var as 
//strict private var Foo: Integer;
function GetFooValue(const AClass: TFoo): Integer;
begin
  Result := PInteger(PByte(AClass) + 4)^
end;

関数GetFooValueは、foo変数がクラスvarのように宣言されていない場合にのみ機能します。

The question is how I must modify the GetFooValue in order to get the value of Foo when is declarated like strict private class var Foo: Integer;

4
@DavidHeffernan、はい、そうです、私はクラスの宣言しかありませんでした。およびdcuファイル。
追加された 著者 Salvador,
私は、 class var のように宣言されているものを除いて、(クラスのインスタンスへの)ポインタとフィールドまたはプロパティへのオフセットを使用して、ターゲットクラスのすべての厳密なプライベートメンバにアクセスできます。
追加された 著者 Salvador,
ソースがない場合、あなたは運がありません。クラス変数はフィールドではなく、グローバル変数なので、フィールド構造のハックではそれらにアクセスできません。これは、ソースのないライブラリを決して使用しないようにするもう一つの理由です。
追加された 著者 Mason Wheeler,
おそらくあなたはソースコードを入手できないでしょうか?そうですか?
追加された 著者 David Heffernan,
ちょっとしたランダムな推測: + 4 なしでこれを試しましたか?そして、GetFooValueを呼び出す前に TFoo 型のオブジェクトを作成した場合(つまり、クラスを使用する場合)はどうなりますか?
追加された 著者 kol,

2 答え

レスキューするための厳密なプライベートクラスvar、クラスヘルパーにアクセスする。

例:

type
  TFoo = class
  strict private class var
    Foo : Integer;
  end;

  TFooHelper = class helper for TFoo
  private
    function GetFooValue : Integer;
  public
    property FooValue : Integer read GetFooValue;
  end;

function TFooHelper.GetFooValue : Integer;
begin
  Result:= Self.Foo; //Access the org class with Self
end;

function GetFooValue( F : TFoo) : Integer;
begin
  Result:= F.GetFooValue;
end;

Var f : TFoo;//don't need to instantiate since we only access class methods

begin
  WriteLn(GetFooValue(f));
  ReadLn;
end.

質問に合った例を更新しました。

7
追加された
ありがとう、それは仕事です。
追加された 著者 Salvador,
クラスヘルパーFTW!
追加された 著者 Warren P,
私はあなたの前の質問にも答えました。 accesing-a- strict-private-field-using-the-rtti 、クラスヘルパーを使用しています。
追加された 著者 LU RD,

あなたは本当にそれを行うことはできません。クラスvarは、グローバル変数として実装され、そのメモリロケーションは、クラスリファレンスが指すクラスVMTの場所と予測可能な関係を持ちません。 em>定数データ領域に格納されます。

この変数にクラスの外部からアクセスする必要がある場合は、その変数をバッキングフィールドとして参照するクラスプロパティを宣言します。

2
追加された
+1しかし、例を傷つけることはありません:)
追加された 著者 Lieven Keersmaekers,
サルバドールには源がないので、これは助けにならない。
追加された 著者 David Heffernan,