[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