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.bra...@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-boun...@lists.freepascal.org > [mailto:fpc-pascal-boun...@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.bra...@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@lists.freepascal.org > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > > _______________________________________________ > fpc-pascal maillist - fpc-pascal@lists.freepascal.org > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal