डेल्फी बर्लिन 10.1 [कमजोर] संदर्भ जोड़ता है। Marco Cantu's Blog पर कुछ मूलभूत बातें हैं।डेल्फी [कमजोर] संदर्भ विशेषता "अमान्य वर्ग टाइपकास्ट" उत्पन्न करती है जब कार्यान्वयन एक से अधिक लाइब्रेरी में होता है
मेरे परीक्षण के लिए मैंने दो ऑटो पुस्तकालयों को दो स्वचालन ऑब्जेक्ट प्रकार बनाए रखा। कंटेनर ऑब्जेक्ट में सामग्री ऑब्जेक्ट्स की एक सूची होती है जबकि सामग्री ऑब्जेक्ट्स में उनके कंटेनर का कमजोर संदर्भ होता है।
निम्नलिखित दो परिदृश्यों का परीक्षण किया और सही ढंग से काम किया (कमजोर संदर्भ अशक्त सेट कर रहे हैं और स्मृति जारी की है) गया:
- एक दोनों इंटरफेस और CoClasses के साथ एकल COM पुस्तकालय।
- दो COM पुस्तकालयों CoClasses
हालांकि, जब मैं दो अलग पुस्तकालयों में coclasses जगह कोड "अवैध वर्ग समान किरदार" का उत्पादन के साथ इंटरफेस के साथ एक और एक अन्य, त्रुटि दूर चला जाता है जब [कमजोर को हटाने ] विशेषता। अजीब नमूना बहाना कृपया, अपने उद्देश्य समस्या कम से कम करने के लिए बस है और मानक कोडिंग अभ्यास के रूप में नहीं लिया जाना चाहिए
यहाँपहले पुस्तकालय .ridl फ़ाइल है कि दोनों इंटरफेस और कंटेनर के लिए CoClass को परिभाषित करता है:
[
uuid(E1EE3651-A400-49BF-B5C5-006D9943B9C0),
version(1.0)
]
library DelphiIntfComLib
{
importlib("stdole2.tlb");
interface IMyContainer;
interface IMyContent;
coclass MyContainer;
[
uuid(A7EF86F7-40CD-41EE-9DA1-4D9B7B24F06B),
helpstring("Dispatch interface for MyContainer Object"),
dual,
oleautomation
]
interface IMyContainer: IDispatch
{
[id(0x000000C9)]
HRESULT _stdcall Add([in] IMyContent* AMyContent);
};
[
uuid(BFD6D976-8CEF-4264-B95A-B5DA7817F6B3),
helpstring("Dispatch interface for MyContent Object"),
dual,
oleautomation
]
interface IMyContent: IDispatch
{
[id(0x000000C9)]
HRESULT _stdcall SetWeakReferenceToContainer([in] IMyContainer* AContainer);
};
[
uuid(1F56198B-B1BE-4E11-BC78-0E6FF8E55214)
]
coclass MyContainer
{
[default] interface IMyContainer;
};
};
यहाँ मेरी कंटेनर को लागू करने
unit Unit1;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
ComObj, ActiveX, DelphiIntfComLib_TLB, StdVcl, Generics.Collections;
type
TMyContainer = class(TAutoObject, IMyContainer)
private
FList: TList<IMyContent>;
protected
procedure Add(const AMyContent: IMyContent); safecall;
public
Destructor Destroy; override;
procedure Initialize; override;
end;
implementation
uses ComServ;
procedure TMyContainer.Add(const AMyContent: IMyContent);
begin
FList.Add(AMyContent);
AMyContent.SetWeakReferenceToContainer(self);
end;
destructor TMyContainer.Destroy;
begin
FList.Free;
inherited;
end;
procedure TMyContainer.Initialize;
begin
inherited;
FList := TList<IMyContent>.create;
end;
initialization
TAutoObjectFactory.Create(ComServer, TMyContainer, Class_MyContainer,
ciMultiInstance, tmApartment);
end.
मेरी दूसरी पुस्तकालय संदर्भ पहली और एकमात्र शामिल मेरी सामग्री इंटरफेस के CoClass
है[
uuid(65659EE4-1949-4112-88CA-F2D5B5D8DA2C),
version(1.0)
]
library DelphiImplComLib
{
importlib("stdole2.tlb");
importlib("DelphiIntfComLib.dll");
coclass MyContent;
[
uuid(79D1669A-8EB6-4AE6-8F4B-91137E6E6DC1)
]
coclass MyContent
{
[default] interface IMyContent;
};
और कमजोर संदर्भ
unit Unit2;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
ComObj, ActiveX, DelphiImplComLib_TLB, StdVcl, DelphiIntfComLib_TLB;
type
TMyContent = class(TAutoObject, IMyContent)
private
[Weak] //If included will cause "invalid class typecast" error
FContainer : IMyContainer;
protected
procedure SetWeakReferenceToContainer(const AContainer: IMyContainer); safecall;
end;
implementation
uses ComServ;
procedure TMyContent.SetWeakReferenceToContainer(const AContainer: IMyContainer);
begin
FContainer := AContainer;
end;
initialization
TAutoObjectFactory.Create(ComServer, TMyContent, Class_MyContent,
ciMultiInstance, tmApartment);
end.
जब मैं अपने कार्यान्वयन विभाजित मुझे त्रुटि क्यों मिलता है मैं इस प्रकार
program Project13;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
DelphiImplComLib_TLB in 'impl\DelphiImplComLib_TLB.pas',
DelphiIntfComLib_TLB in 'Intf\DelphiIntfComLib_TLB.pas';
var
GMyContainer : IMyContainer;
GMyContent : IMyContent;
begin
GMyContainer := CoMyContainer.Create;
GMyContent := CoMyContent.Create;
GMyContainer.Add(GMyContent);
end.
परीक्षण किया साथ इसके कार्यान्वयन? मैं इस समस्या को कैसे कम कर सकता हूं?
मैं ऑटो-एनआईएल सुविधा रखने की उम्मीद कर रहा था, लेकिन मैं असुरक्षित के लिए बस जाऊंगा। मैं उस जोखिम को अन्य तरीकों से कम कर दूंगा –
@ जैस्परशेलिंगरहाउट: ऑटो-नील सुविधा 'टॉब्जेक्ट' विनाशक से आती है। जब किसी ऑब्जेक्ट को नष्ट किया जा रहा है, तो यह कमजोर संदर्भों की वैश्विक तालिका से गुजरता है और उस वस्तु को संदर्भित करने वाले किसी भी संदर्भ को निल्स करता है। तो यदि आपके पास एक COM इंटरफ़ेस है जिसे 'TObject' क्लास द्वारा लागू नहीं किया गया है, तो उस ऑब्जेक्ट के कमजोर संदर्भ ऑटो-शून्य नहीं होंगे। –
इस विशिष्ट नमूना मामले में इसे प्रबंधित करना बहुत मुश्किल नहीं है। विनाश पर कंटेनर बच्चों पर कमजोर संदर्भ को पार कर सकता है और सेट कर सकता है। सामग्री को हटाने के लिए कोई भी तरीका वही कर सकता है। –