2010-05-05 109 views
2

有没有办法在OleVariant中传递一个包装并解开TObject后代?我正在尝试通过自动化对象传递TObject。我知道这不是一个好主意,但我没有一个好的选择。将对象作为OleVariant在Delphi中投射对象

该对象是从同一个自动化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. 

回答

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; 
+0

如上所述:这只适用于相同的过程。所以只有在进程COM对象(DLL)! – 2010-05-05 11:47:11

+0

这是我一直在寻找的黑客!其他答案也很好,但这符合我的迫切需求,谢谢。 – 2010-05-05 21:08:57

+0

如果它是一个进程中的COM DLL,那么你为什么要首先限制自己到OLEVariant?如果提供调度接口(对于自动化客户端),则只需遵守自动化兼容类型。使用进程内COM DLL,我认为您可以选择退出自动化类型安全并直接传递TObject。但是,自从我在这个层面上完成COM以来,我已经有很长一段时间了,所以我可能会记错。 – Deltics 2010-05-05 21:54:35

4

您可以编写并注册一个定制变体类型;以TSQLTimeStampVariantType为例。

另一种方法是为您的班级编写自动包装。双调度接口通过IDispatch自动支持后期绑定,支持OleVariant

+0

+1为自动包装 – 2010-05-05 09:52:55

2

让你的对象实现一个接口并通过接口。

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

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

我不会保证这个方法有效,你应该使用TOndrej的建议并为你的课程做一个自动包装。如果你知道你的方式,不应该很难。