मैं ओलेवीरिएंट में एन्सेप्लेटेड इंटरफ़ेस को रिलीज़ करने के लिए एक सुरक्षित/निर्धारिक तरीका खोजने का प्रयास कर रहा हूं।OleVariant के पीछे एक इंटरफ़ेस मुक्त करने का सही तरीका क्या है?
AFAICS डेल्फी एक प्रक्रिया के अंत में इंटरफेस संदर्भ जारी करता है, लेकिन मेरे मामले में मुझे इसे पहले करना है, क्योंकि मुझे COM को बंद करना है।
procedure Test;
var
LLibrary: OleVariant;
begin
CoInitialize(nil);
try
LLibrary := Null;
try
LLibrary := CreateOleObject(LibraryName);
finally
LLibrary := Unassigned; // <-- I would like to release the interface here
end;
finally
CoUninitialize; // <-- Shutdown of COM
end;
end; // <-- The compiler releases the interface here
मैं एक अतिरिक्त वर्ग उदाहरण इससे पहले कि मैं
CoUninitialize
फोन मैं रिक्त कर सकते हैं OleVariant डालने की हालांकि
।
procedure Test;
var
Container: TLibraryContainer; // Holds the OleVariant
begin
CoInitialize(nil);
try
Container := TLibraryContainer.Create;
try
{...}
finally
Container.Free;
end;
finally
CoUninitialize;
end;
end;
क्या यह समाधान सुरक्षित है या क्या कोई बेहतर समाधान है जिसे मैंने अनदेखा किया है?
एकमात्र वास्तविक विकल्प द्वितीयक दिनचर्या का उपयोग कर रहा है, जब तक कि आप गिनती फ़ंक्शन कॉल का आनंद न लें और यह सुनिश्चित करने के लिए जेनरेट किए गए असेंबलर कोड का निरीक्षण न करें कि कोई छुपा स्थानीय चर नहीं है। अपने 'DoWork' दिनचर्या को कॉल करने के लिए +1 ... 'DoWork', विवरण के लिए मेरा हटाए गए उत्तर देखें। –
@Cosmin मैं मानता हूं कि दूसरा विकल्प बेहतर है। –
असल में मेरा असली कोड थोड़ा अधिक परिष्कृत है और मुझे लगता है कि मुझे आपके पहले संस्करण का उपयोग करना होगा, लेकिन मैं कोड को दोबारा करने की कोशिश करूंगा ताकि मैं दूसरे का उपयोग कर सकूं। :) –