Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2017-05

Why casting interface as Tobject will result in a different reference?

7 messages · 6 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Dennis

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?

Dennis

Reply by email

Michael Van Canneyt
to Dennis
Dennis wrote 22 lines
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 ?

Michael.

Reply by email

Ryan Joseph
to Dennis: I defined a generic TList<IMyInterface> //CORBA style interface var aInt : IMyInterface;…
Show quoted text 5 lines
On May 26, 2017, at 4:06 PM, Dennis wrote: writeln( IntToHex(LongWord(aInt),4)); writeln( IntToHex(LongWord(aObj),4)); //this will output a different Hex value from previous writeln

I think an object and interface are indeed not the same memory and you need to use Supports() to get a reference to the interface from the object. The interface reference can be cached and used later or you need to call Supports every time which does a string compare and is slow.

Regards,
Ryan Joseph

Reply by email

Sven Barth
to Michael Van Canneyt: Why do you think the interface and the object are the same ? They are not. An interface…

2017-05-26 11:08 GMT+02:00 Michael Van Canneyt :

Show quoted text 31 lines
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

Reply by email

Dennis Poon
to Sven Barth
Sven Barth wrote 15 lines
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

Sorry, I got it wrong. The interface was in fact COM style instead of CORBA.

In case of COM interface, why

var
    aInt : IMyInterface;
   aObj : TObject;
begin
....
....
...
    aInt := MyList.Items[0];
    aObj := aInt as TObject;

why sometimes (not always) aInt (aObj as IMyInterface ) ?

Dennis

Reply by email

Sven Barth
to Dennis Poon

2017-05-27 18:10 GMT+02:00 Dennis Poon :

Show quoted text 36 lines
Sven Barth via fpc-pascal wrote: > > 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 Sorry, I got it wrong. The interface was in fact COM style instead of CORBA. In case of COM interface, why var aInt : IMyInterface; aObj : TObject; begin .... .... ... aInt := MyList.Items[0]; aObj := aInt as TObject; why sometimes (not always) aInt (aObj as IMyInterface ) ?

Would you please provide a full, yet simple as possible example that shows this? I can't reproduce it with merely code fragments as for me it works.

Regards,
Sven

Reply by email