3

OleVariant で TObject の子孫をラップしてアンラップする方法はありますか? オートメーション オブジェクト間で TObject を渡そうとしています。私はそれが良い考えではないことを知っていますが、私には良い代替手段がありません.

オブジェクトは、同じオートメーション dll からのオブジェクト間で渡されます (違いがある場合)。

このようなもの:

function GetMyObjAsVariant;
var
  MyObj: TMyObj;
begin
  MyObj := TMyObj.Create;
  result := OleVariant(MyObj);
end;

クライアントが次のように使用するもの

var
  MyObj: TMyObj;
begin
  MyObj := GetMyObjAsVariant as TMyObj;
end;

これはコンパイルに失敗し、戻ります

E2015 Operator not applicable to this operand type.
4

3 に答える 3

4

カスタム バリアント型を作成して登録できます。例を見てくださいTSQLTimeStampVariantType

別の方法は、クラスの自動化ラッパーを作成することです。IDispatchデュアル ディスパッチ インターフェイスは、によってサポートされるレイト バインディングを自動的にサポートしOleVariantます。

于 2010-05-05T08:40:53.320 に答える
2

絶対に、本当に必要で、両方のオブジェクトが同じプロセスにあることが確実にわかっている場合は、任意のTObjectを整数にキャストしてから、TObjectに戻すことができます。

function GetMyObjAsVariant;
var
  MyObj: TMyObj;
begin
  MyObj := TMyObj.Create;
  result := OleVariant(Integer(MyObj));
end;

その後:

var
  anInt: Integer;
  MyObj: TMyObj;
begin
  anInt := GetMyObjAsVariant;
  MyObj := TMyObj(anInt);
end;
于 2010-05-05T09:27:43.357 に答える
2

オブジェクトにインターフェイスを実装させ、インターフェイスを渡します。

function GetMyObjAsVariant: OleVariant;
var
  MyObj: IMyObj;
begin
  MyObj := TMyObj.Create;
  result := MyObj;
end;

var
  MyObj: IMyObj;
begin
  MyObj := GetMyObjAsVariant as IMyObj;
end;

これが機能することを保証するものではありません。TOndrej の提案に従い、クラスの自動化ラッパーを作成する必要があります。道を知っていれば、それほど難しいことではありません。

于 2010-05-05T09:52:13.263 に答える