Привести объект как OleVariant в Delphi - PullRequest
3 голосов
/ 05 мая 2010

Есть ли способ передать перенос и развернуть потомок TObject в OleVariant? Я пытаюсь передать объект TO через объект автоматизации. Я знаю, что это не очень хорошая идея, но у меня нет хорошей альтернативы.

Объект должен передаваться между объектами из одной и той же библиотеки автоматизации, если это имеет какое-либо значение.

Примерно так:

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.

Ответы [ 3 ]

4 голосов
/ 05 мая 2010

Вы можете написать и зарегистрировать пользовательский тип Variant; посмотрите на TSQLTimeStampVariantType для примера.

Альтернативой было бы написать оболочку автоматизации для вашего класса. Двойной интерфейс автоматически поддерживает позднюю привязку через IDispatch, что поддерживается OleVariant.

2 голосов
/ 05 мая 2010

Позвольте вашему объекту реализовать интерфейс и передать интерфейс.

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

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

Я не гарантирую, что это работает, вы должны согласиться с предложением TOndrej и сделать оболочку для вашего класса. Это не должно быть трудно, если вы знаете, как вокруг.

2 голосов
/ 05 мая 2010

Если вы действительно, действительно хотите этого и уверены, что оба объекта находятся в одном и том же процессе, вы можете привести любой объект TO к объекту Integer, а затем вернуться к объекту TO:

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;
...