[fpc-pascal] support for using anactivex
Ludo Brands
ludo.brands at free.fr
Mon May 30 15:35:26 CEST 2011
Use Item(i). Item(long Index, [out, retval] ITransducer* *pVal); means
method with 1 input Index and Output Itransducer^.
Ludo
> -----Message d'origine-----
> De : fpc-pascal-bounces at lists.freepascal.org
> [mailto:fpc-pascal-bounces at lists.freepascal.org] De la part
> de Roberto Padovani
> Envoyé : lundi 30 mai 2011 14:16
> À : FPC-Pascal users discussions
> Objet : Re: RE : RE : RE : RE : RE : RE : [fpc-pascal]
> support for using anactivex
>
>
> Hi Ludo,
>
> I really cannot get the items to work. I simplyfied the
> source code to the minimum in order to test the items stuff.
>
> var obj, item, items : variant;
>
> obj := CreateOleObject('WRGactiveX.Device'); // OK
> items := obj.Transducers; // OK
> writeln('Count: ', items.Count); // OK ,
> always prints 8
>
> item := items.item[1]; // Crash: EOleSysError : Numero di
> parametri non valido.
>
> Where the exception comment translates to "wrong number of
> parameters". Instead, writing item := items[1] gives the
> exception EVariantInvalidArgError : Invalid argument: Dispatch
>
> In the activex source code I hav these interface declarations:
>
> interface ITransducer : IDispatch
> {
> [propget, id(1), helpstring("property Name")]
> HRESULT Name([out, retval] BSTR *pVal);
> [propget, id(2), helpstring("property Status")]
> HRESULT Status([out, retval] WRG_TransdStatus *pVal);
> [propget, id(4), helpstring("property Meas")]
> HRESULT Meas([out, retval] double *pVal);
> };
>
> interface ITransducers : IDispatch
> {
> [propget, id(1), helpstring("property Count")]
> HRESULT Count([out, retval] long *pVal);
> [propget, id(DISPID_VALUE),
> helpstring("property Item")] HRESULT Item(long Index, [out,
> retval] ITransducer* *pVal);
> [propget, id(DISPID_NEWENUM),
> helpstring("property _NewEnum"), hidden] HRESULT
> _NewEnum([out, retval] LPUNKNOWN *pVal);
> };
>
> and used inside the IDevice class like:
>
> [propget, id(21), helpstring("property
> Transducers")] HRESULT Transducers([out, retval] ITransducers* *pVal);
>
>
> I would be very grateful if you could help me once more.
>
> Roberto
>
>
>
> 2011/5/25 Ludo Brands <ludo.brands at free.fr>:
> > Using variants you can transparently "walk" along the
> exposed objects.
> > The variant contains the Idispatch of the object and gets
> the exposed
> > methods at runtime. Properties are implemented as get and
> put methods
> > or just get methods for read only properties.
> >
> > If you have something like
> > Itransducers = interface
> > ..
> > property transducer[Index:integer]:Itransducer;
> > end;
> >
> > Then you would do
> > transducer := transducers.transducer[index];
> >
> > transducer := transducers[index]; works only if transducer is the
> > default property for Itransducers. I'm not sure if fpc
> supports this.
> >
> > Ludo
> >
> >
> > -----Message d'origine-----
> > De : fpc-pascal-bounces at lists.freepascal.org
> > [mailto:fpc-pascal-bounces at lists.freepascal.org] De la part
> de Roberto
> > Padovani Envoyé : mercredi 25 mai 2011 19:34
> > À : FPC-Pascal users discussions
> > Objet : Re: RE : RE : RE : RE : RE : [fpc-pascal] support
> for using an
> > activex
> >
> >
> > 2011/5/25 Ludo Brands <ludo.brands at free.fr>:
> >> The code in article
> >>
> http://www.informit.com/articles/article.aspx?p=130494&seqNum=5 goes
> >> a long way in doing what you want to do. Unit Eventsink
> does pretty
> >> much of the legwork. You should remove the procedure
> register since
> >> that is the Delphi way to get a component on the toolbar.
> Remove also
> >> the {$IFDEF VER100} and {$ENDIF}. The unit actually
> includes the code
> >> for InterfaceConnect!!
> >
> > found that! great!
> >
> >
> >> As for the tlb conversion, in your case
> >>
> >> IEventIntfEvents = dispinterface
> >> ['{168F5642-5751-49F5-9AA4-B8A7A5F6A5B8}']
> >> end;
> >>
> >> should do (that is for the events part). AFAIK the procedure and
> >> dispid definitions are only needed for the server. You are only
> >> concerned with dispid's. No need to create prototypes for
> >> OnCommChanged() etc. EventSink1Invoke would be a simple
> case DispID
> >> of
> >> 1: // do CommChanged
> >> 2: // do StatesChanged
> >> ...
> >> end;
> >>
> >>
> >
> > Now I am "wasting" time making the tlb pascal definitions. For the
> > event part I'm fine with the dispid's Until now I was calling the
> > activex method with variants, in and out, but now I discovered that
> > this IDevice class has a property like: property
> > Sensors: ISensors;
> > which inside is a list of items like Sensor: ISensor.
> >
> > Can I read the sensores with a variant? Then, to see the
> fields inside
> > each sensor, I think a I need a class to do that... The activex has
> > all of these classes with the suitable dispinterfaces and
> uuids and so
> > on. But if I define
> > var device, transducers, transducer : variant;
> > and create
> > device := CreateOleObject('Device');
> > then, can i simply write the following ?
> > transducers := device.Transducers;
> > transducer := transducers[index];
> >
> >
> > It's a long path until I get this stuff working...
> >
> > R#
> > _______________________________________________
> > fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> > http://lists.freepascal.org/mailman/listinfo/fpc-pascal
> >
> > _______________________________________________
> > fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> > http://lists.freepascal.org/mailman/listinfo/fpc-pascal
> >
> _______________________________________________
> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
>
More information about the fpc-pascal
mailing list