6

ネイキッド ポインターをバリアントに変換できる必要があります。ポインターがバリアントを指していることはわかっていますが、元に戻すことができないようです。ストレートキャストは(私がほとんど思っていたように)失敗します:

Result := Variant(FAddress)^

コンパイラ エラーを返します: [DCC エラー] E2089 無効な型キャスト

variants.pas ユニットも精査しましたが、何も飛び出しませんでした。

明らかに私は何かが欠けています。これを行う方法は何ですか?

4

1 に答える 1

16

ポインターが Variant を指している場合、その型は PVariant です。それに型キャストし、逆参照します。

Result := PVariant(FAddress)^;

さらに良いことに、最初に正しい型で宣言するFAddressと、型キャストする必要がなくなります。

var
  FAddress: PVariant;

Result := FAddress^;

Variant は Pointer よりも大きな型であるため、コンパイラは試行された型キャストを無効と見なします。コンパイラは、完全な Variant 値を作成するための追加データを取得する場所を認識していません。また、型キャスト有効な場合でも、^バリアントでの演算子の使用は許可されません。あなたはこれでうまくいったかもしれません:

Result := Variant(FAddress^);

私はそれが好きではありませんでした。FAddress が型指定されていないポインターの場合、それを逆参照すると、サイズや型がまったくない値が生成されます。そのようなものを型キャストするのは奇妙です。

于 2011-04-13T18:41:17.347 に答える