2008-12-14 58 views

回答

6

這只是一個意見,從我的什麼變體可以和不能做的經驗。

如果您將COM對象放入它中,它將作爲IDispatch引用存儲,因此您在此對象上訪問的任何方法調用或屬性都將轉換爲查找方法/對象的內部DISPID的代碼,屬性,將構造一個包含方法參數的數組,並通過IDispatch接口調用該方法。

換句話說,IDispatch接口爲您處理,您通常會做的方式,但它是由編譯器自動地完成。

然而,對於正常德爾福對象,事情變得更難。您可以使用RTTI來查找並調用已發佈的方法和屬性,但這就是它。如果你有一個非公開的非虛方法的名字,Delphi在你的方法中找不到它的正確地址。

換句話說,你所能做的只是將保存爲這個對象,你將無法使用它。也許他們可以增加對釋放它的支持,但是可能會這樣。

我知道一個事實,如果你正確地實現IDispatch,你可以安全地存儲,並通過變體使用的對象。我有一個類可以用作你想要這樣做的Delphi對象的基類。它會自動公開發布的方法/屬性,如果你想通過一些受保護的方法調用,你可以添加更多。如果對這樣的班級有興趣,我可以把它放在某個地方。

但同樣,這是通過IDispatch,它使用公佈的方法,剩下的就是手工代碼,所以對於變種的支持,都必須內置到你的對象,通過你。

這就是爲什麼我認爲他們只是說:這隻會產生投訴,我們能夠舉行一個對象,但它只是無用的。

但這只是我的想法。也許有人官員有更好的答案。

+4

你是非常正確的。您還應該提及TCustomVariantType和TInvokeableVariantType類。這些類顯示了類需要做的所有事情,以便能夠*(不僅僅是存儲)在Variant中使用,而不必實現IDispatch。 – 2008-12-14 17:34:00

+0

+1 Rob:TCustomVariantType和TInvokeableVariantType相當強大。一些性能處罰,但是[可能會繞過一些低級黑客攻擊](http://blog.synopse.info/post/2011/07/01/Faster-variant-late-binding)。 – 2013-10-10 06:47:04

24

您絕對可以在存儲 Variant變量內的對象 - 只需將其轉換爲NativeUI。無論如何,一個對象只是一個指針。

obj := TObject.Create; 
v := NativeUInt(obj); 
obj := TSomeObject(NativeUInt(v)); 
6
我用了變種,以持有使用變內部過去的對象

,代碼是這樣的:

var 
    MyObject: TMyObject; 
    Value: Variant; 
begin 
    MyObject:= TMyObject.Create; 
    TVarData(Value).VType:= VarByRef; 
    TVarData(Value).VPointer:= MyObject; 
相關問題