[Lazarus] Breaking change
Michael Van Canneyt
michael at freepascal.org
Sun Jul 23 15:19:53 CEST 2017
On Sun, 23 Jul 2017, Martok via Lazarus wrote:
> Am 23.07.2017 um 14:24 schrieb Michael Van Canneyt via Lazarus:
>>> The pointer-ness of REFIID is an artefact of the C-ABI. It is not meant to mean
>>> 'pass a pointer to a GUID-struct', but 'pass a GUID using byref'. We have
>>> constref for that.
>>
>> See the link to the Windows MSDN.
> Yes, so?
Well, if they declare it as a pointer, why should I not do the same :) ?
>
> REFIID is also the type of the first argument of QueryInterface.
> <https://msdn.microsoft.com/en-us/library/windows/desktop/ms682521%28v=vs.85%29.aspx>
I know.
>
> { IUnknown }
> function QueryInterface({$IFDEF
> FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): Hresult;
> virtual; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
That is a historical monstrosity :)
>
> But I see already it has been translated differently in every unit (mostly
> because MS made it uniform only after the headers were translated), so might as
> well use the new one to keep things interesting. Carry on.
I agree the matter is a bit dubious :/
But, before doing anything, I looked around. Saw some C# and VB import
statements. Noticed even in Delphi it's not 100% clear (see winrt* units),
and finally decided to do it like this to make people aware of the fact
that if they used a refiid argument in the past, it can hardly have worked.
The current definition makes it quite clear that it is in fact a pointer to a GUID.
Michael.
More information about the Lazarus
mailing list