[fpc-pascal] support for using an activex

Ludo Brands ludo.brands at free.fr
Wed May 25 20:47:29 CEST 2011


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




More information about the fpc-pascal mailing list