[fpc-pascal] Why casting interface as Tobject will result in a different reference?
Sven Barth
pascaldragon at googlemail.com
Fri May 26 13:15:11 CEST 2017
2017-05-26 11:08 GMT+02:00 Michael Van Canneyt <michael at freepascal.org>:
>
>
> On Fri, 26 May 2017, Dennis wrote:
>
>> I defined a generic TList<IMyInterface> //CORBA style interface
>>
>> var
>> aInt : IMyInterface;
>> aObj : TObject;
>> begin
>> aInt := MyList.Items[0];
>> aObj := aInt as TObject;
>>
>> writeln( IntToHex(LongWord(aInt),4));
>>
>> writeln( IntToHex(LongWord(aObj),4)); //this will output a different
>> Hex value from previous writeln
>>
>>
>> //This is causing a problem to me because I later
>>
>> MyList.Remove(aObj as IMyInterface);//will fail because it is not the
>> same as aInt and thus fail to locate the item to remove
>>
>>
>> Am I missing some fundamental understanding of interface reference?
>
>
> Why do you think the interface and the object are the same ? They are not.
> An interface is just a bunch of method pointers, and an object has instance
> data associated with it. Hardly the same thing, I would think ?
The idea itself is valid, cause "(IMyInterfaceVar as TObject) as
IMyInterface = IMyInterfaceVar" is true if and only if IMyInterface is
a COM interface. If IMyInterface really is a CORBA interface as Dennis
wrote then the compiler should already have complained at the "aObj :=
aInt as TObject" line as this type of conversion is *not* supported by
CORBA interfaces (cause they don't provide QueryInterface() which is
needed for this). At least for me the compiler *did* complain (both
3.0.2 and 3.1.1) when I tested this.
So the question is: is IMyInterface indeed a CORBA interface? If so
then why does the compiler not complain? If not then why doesn't it
work? For both cases a full example would be needed to investigate
this.
Regards,
Sven
More information about the fpc-pascal
mailing list