[Lazarus] OI / App crash - components with published interfaces

Martin Schreiber mse00000 at gmail.com
Sun Feb 18 16:32:05 CET 2018


On Sunday 18 February 2018 13:16:36 Andreas Friec39f via Lazarus wrote:
> Now i have inserted code in the TIntfComp to remove the link to the
> interface
>
> --------------------
>
> destructor TIntfComp.Destroy;
> begin
>    FObjectHasInterface := nil;  // <<-- Crahe here now
>    inherited Destroy;
> end;
> --------------------
>
> And now i it crash explicitly  at the line wher i try to 'unlink'. And
> the Callstack from Lazarus give me some information. The setting to nil,
> call fpc_intf_assign and  call IUnknown(D)._Release. But this is
> absolutly unwated (and unexpected) for me here.
>
I did not read the whole thread.
If you want to set a COM interface pointer to nil without calling _release() 
use 
"
 pointer(FObjectHasInterface):= nil;
"
It is very difficult or even impossible in Delphi and FPC to reliable mix 
reference counted COM interfaces with TComponent/TObject life cycle 
management. If you need interfaces without reference counting use CORBA 
interfaces.
Never use COM-interface variables if there are TObject.Destroy() calls. It is 
an undefined "implementation detail" when the interface variable goes out of 
scope, there is a risk that it goes out of scope and _release() will be 
called after the according object has been destroyed by a TObject.Destroy() 
call.

Martin


More information about the Lazarus mailing list