Try it this way. This breaks it down into what the compiler "should" be
doing (and probably is doing). You can then see if anything is going wrong.
I think you may find the problem occurs before the ICollection.Add is done.
Who knows - maybe you have found a compiler bug? (By the way what version
are you using? I know D3 did have a bug with passing interfaces and
parameters - but can't remember the exact problem).
var
INewObject: Iunknown;
VNewObject: OLEVariant;
begin
INewObject := NewObject as IUnknown;
VNewObject := INewObject;
ICollection.Add( VNewObject );
Myles.
> Myles Penlington <[EMAIL PROTECTED]> on 07/08/2000 14:51:07
>
> Please respond to [EMAIL PROTECTED]
>
> To: Multiple recipients of list delphi <[EMAIL PROTECTED]>
> cc: (bcc: Phillip Middlemiss/NZ Forest Research Institute/NZ)
>
> Subject: RE: [DUG]: Aaarrgh! Variants@#%^$3!!
>
>
>
> > However, the basic problem is still that passing an IUnknown to a method
> > expecting a variant seems to fail. The call goes through allright, but
> > casting
> > the variant back to an IUnknown returns an unnassigned interface.
> >> What happens if you put a break point on the assignment in the
> collection
> item? Is the variant NIL?
> It should not be, else all I could say is that the problem lies elsewhere.
>
> > Does casting an interface to a variant increment the reference count?
> that
> > could
> > be the problem?
> >> It could be a problem, but the interface would still NOT be NIL. Have
> not
> looked at the compiled code to see what happens.
>
> Myles.
>
>
>
>
> > Myles Penlington <[EMAIL PROTECTED]> on 07/08/2000 12:25:35
> >
> > Please respond to [EMAIL PROTECTED]
> >
> > To: Multiple recipients of list delphi <[EMAIL PROTECTED]>
> > cc: (bcc: Phillip Middlemiss/NZ Forest Research Institute/NZ)
> >
> > Subject: RE: [DUG]: Aaarrgh! Variants@#%^$3!!
> >
> >
> >
> > Don't quite see why you are using variants in this case, but it should
> not
> > make any difference.
> >
> > MyList.add(aNewObject as IUnknown)
> >
> > This is the line you need to check. Does AnewObject support the IUnknown
> > interface?
> > It would appear from your comments that it does not.
> >
> > I would probably use Interface variables rather than Variants by
> > preference.
> > The only reason to use OLEVariants would be if you are going to pass the
> > object reference to VBScript/JScript eg ASP/OleAutomation.
> >
> > eg MyList.Add( AInterface: IUnknown);
> >
> > "My stubs are descended from TInterfacedObject but implement stub
> methods
> > for
> > IDispatch. "
> >
> > Why do this?? Seems a complete waste of time. Does not achieve anything.
> > Your comment previous to this does however make complete sense, but it
> > does
> > not require this to be done.
> >
> > Myles.
> >
> >
> > > -----Original Message-----
> > > From: [EMAIL PROTECTED]
> > > [SMTP:[EMAIL PROTECTED]]
> > > Sent: Monday, August 07, 2000 11:58 AM
> > > To: Multiple recipients of list delphi
> > > Subject: [DUG]: Aaarrgh! Variants@#%^$3!!
> > >
> > >
> > >
> > > Hi all,
> > >
> > > I am writing a client GUI that is talking to a number of Java servers
> > via
> > > J-Integra (therefore COM) although that is really only background and
> > not
> > > vital
> > > to the problem.
> > >
> > > I have written stubs for all the classes that I need from the servers
> so
> > I
> > > can
> > > build the GUI without the servers needing to be up to date or even
> > > running.My
> > > stubs are descended from TInterfacedObject but implement stub methods
> > for
> > > IDispatch.
> > >
> > > The problem boils down to storing the stub objects in a list that
> deals
> > > with
> > > OLEVariants. The List uses a TCollectionItem internally, storing each
> > > added
> > > variant inside a TCollectionItem descendant that holds onto an
> > OLEVariant.
> > > Adding a new item to the list looks like this:
> > >
> > > MyList.add(aNewObject as IUnknown)
> > >
> > > which automatically casts the IUnknown to an OLEVariant which the Add
> > > method is
> > > expecting. The Add method assigns the OLEVariant to a newly created
> > > CollectionItem descendant.
> > >
> > > However! Inside the add method, before I do anything, in the
> > > Evaluate/Modify
> > > dialog, I cast the passed OLEVariant back to an IUnknown and it
> informs
> > me
> > > that
> > > it is nil!!!!
> > >
> > > Is this because the IDispatch interface is stubbed so therefore not a
> > real
> > > ActiveX object? or am I just missing something with variants? This is
> my
> > > first
> > > time using them.
> > >
> > > Any help would be great,
> > >
> > > cheers,
> > >
> > > Phil Middlemiss.
> > >
> > >
> > >
> >
> --------------------------------------------------------------------------
> > > -
> > > New Zealand Delphi Users group - Delphi List -
> [EMAIL PROTECTED]
> > > Website: http://www.delphi.org.nz
> >
> --------------------------------------------------------------------------
> > -
> > New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
> > Website: http://www.delphi.org.nz
> >
> >
> >
> >
> >
> >
> >
> --------------------------------------------------------------------------
> > -
> > New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
> > Website: http://www.delphi.org.nz
> --------------------------------------------------------------------------
> -
> New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
> Website: http://www.delphi.org.nz
>
>
>
>
>
>
> --------------------------------------------------------------------------
> -
> New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
> Website: http://www.delphi.org.nz
---------------------------------------------------------------------------
New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
Website: http://www.delphi.org.nz