[fpc-devel] Reference counting interface objects
Michael Van Canneyt
michael at freepascal.org
Thu Oct 16 13:07:38 CEST 2014
On Thu, 16 Oct 2014, Adriaan van Os wrote:
> Section 7.6 in the FreePascal Language Reference discusses automatic
> reference counting for COM interfaces. It details assignments to variables
> and temporary variables. But the section doesn't mention parameter passing.
> What happens when interfaces are passed to functions, procedures and methods
> ?
>
> From reading Delphi documentation and by experimenting a bit, there seems to
> be a great difference between value and CONST parameters and between VAR and
> OUT parameters. I suggest to extend the manual to explain this in detail.
That will require the compiler devs explaining in detail how it works,
because I haven't got a clue. AFAIK var, const and out behave the same
where ref counting is concerned, with 'value' parameters being the only
difference.
>
> For example, I have an interface IMFMediaEventGenerator (from Windows
> MediaFoundation) with a method GetEvent
>
> type
> IMFMediaEventGenerator = interface( IUnknown) ...
> ....
> function GetEvent( dwFlags: DWORD; out ppEvent: IMFMediaEvent):
> HResult; stdcall;
>
> Now, suppose I am calling GetEvent in a loop
>
> theEvent := nil;
> theEventType := MEUnknown;
> theResult := S_OK;
> while ( theEventType <> MESessionClosed) and ( theResult >= S_OK) do
> begin
> theResult := theSession.GetEvent( 0, theEvent);
> ...
>
> Now, it seems (correct me if I am wrong) that theEvent doesn't need to be
> manually released, because it has been declared as an OUT parameter rather
> than a VAR parameter. So, if this is true, this information is crucial when
> writing interface bindings.
Indeed.
>
> In general, I am not a proponent of "compiler magic" because it confuses
> things, puts it under the table. I would certainly welcome a compiler option
> to NOT auto-refcount.
Talk about going against the spirit of the times :-)
Michael.
More information about the fpc-devel
mailing list