[fpc-devel] Reference counting interface objects
Adriaan van Os
fpc at microbizz.nl
Thu Oct 16 12:35:21 CEST 2014
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.
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.
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.
Regards,
Adriaan van Os
More information about the fpc-devel
mailing list