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的建議併爲你的課程做一個自動包裝。如果你知道你的方式,不應該很難。