2010-10-21 44 views
3

實際上,我使用delphi的後期綁定,我需要知道這是與它合作的正確方法。在Delphi中使用LateBinding的正確方法是什麼?

我主要關心的是如何處理這些對象所使用的內存,我必須釋放內存?如果有人簡單介紹一下如何在這種類型的對象進行處理內存

檢查此示例代碼

var 
    chEaten: Integer; 
    BindCtx: IBindCtx; 
    Moniker: IMoniker; 
MyObject:: IDispatch; 
begin 
try 
    OleCheck(CreateBindCtx(0, bindCtx)); 
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr('oleobject.class'), chEaten, Moniker)); 
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, MyObject)); 

    MyObject.Metod1(); 
    MyObject.Metod2(); 
finally 
MyObject:=nil,// is this necesary? 
end; 

end; 

將是有益的。

在此先感謝。

回答

3

Delphi中的COM接口對象由編譯器自動管理。它會在適當的位置插入隱藏的呼叫到AddRefRelease,當您的接口超出範圍時,它們將自動調用Release方法。所以不,你不必出的參考。

+2

梅森是正確的,你不必到零的參考,因爲它會被處理對你而言,但自己做這件事沒有任何問題。您也沒有提及BindCtx或Moniker的引用,但不要擔心它們一旦超出範圍就會被釋放。 – skamradt 2010-10-21 03:03:19

+0

非常感謝梅森。 – Salvador 2010-10-21 12:08:43

0

就像梅森說的那樣,接口的內存是由編譯器爲你管理的。但是,StringToOleStr()會返回一個需要使用SysFreeString()手動釋放的已分配BSTR。您應該使用WideString的類型,而不是,它管理的內存給你,比如:

OleCheck(MkParseDisplayName(BindCtx, PWideChar(WideString('oleobject.class')), chEaten, Moniker)); 

或者:

var 
    w: WideString; 

w := 'oleobject.class'; 
OleCheck(MkParseDisplayName(BindCtx, PWideChar(w), chEaten, Moniker)); 
相關問題