Re: RE : RE : RE : RE : RE : RE : [fpc-pascal] support for using an activex
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=130494seqNum=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
Re: RE : RE : RE : [fpc-pascal] support for using an activex
2011/5/24 Ludo Brands ludo.bra...@free.fr: The following delphi articles should help creating an event sink: http://www.informit.com/articles/article.aspx?p=130494seqNum=5 This is an interesting one since it is written for Delphi 3-4 which missed a lot of the automated COM handling. This is much closer to where fpc is now. http://www.blong.com/Conferences/IConUK2000/DelphiMoreAutomation/More%20Auto mation%20In%20Delphi.htm#HandcraftedEventSink A good intruduction to connectable objects: http://www.gtro.com/delphi/comevents_e.php Thanks a lot! I'm reading it all and writing some code. But in all of those docs there the InterfaceConnect routine is usedbut I can't find it anywhere. Besides, is there something to convert the tlb to pascal? Or shall I do it manually? I might be wrong, but it seems to me that it should be possible to write a general TSimpleEventSink class which does most of all the COM work, and exposes a pascal-standard event management. The TSimpleEventSink class might have an Events property which is a dynamic array of TNotifyEvents; the client could resize it and link its event handlers. At the same time the TSimpleEventSink reacts to the server events by mapping the dispid's to the Events array index, up to its current maximum dimension. Well, I'm still quite confused besides the missing InterfaceConnect method, is there any freepascal example available? On the web I can only find delphi ones. Thanks, Roberto ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
RE : RE : RE : RE : [fpc-pascal] support for using an activex
Interfaceconnect calls Advice on the objects IConnectionPoint. I can't share Delphi code here but essentially what you do is: Get IConnectionPointContainer (CPC) from IUnknown (ActiveXObject) : ActiveXObject.QueryInterface(IConnectionPointContainer, CPC); Get IConnectionPoint (ppcp) for the IID of interest (RIID) from IConnectionPointContainer : CPC.FindConnectionPoint(RIID, ppcp); Call Advice on IConnectionPoint (ppcp) with the sink interface you created : CP.Advise(unkSink, dwCookie); That's it! Keep hold of dwCookie as it is used to disconnect later on: CP.UnAdvise(dwCookie); 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 13:18 À : FPC-Pascal users discussions Objet : Re: RE : RE : RE : [fpc-pascal] support for using an activex 2011/5/24 Ludo Brands ludo.bra...@free.fr: The following delphi articles should help creating an event sink: http://www.informit.com/articles/article.aspx?p=130494seqNum=5 This is an interesting one since it is written for Delphi 3-4 which missed a lot of the automated COM handling. This is much closer to where fpc is now. http://www.blong.com/Conferences/IConUK2000/DelphiMoreAutomation/More% 20Auto mation%20In%20Delphi.htm#HandcraftedEventSink A good intruduction to connectable objects: http://www.gtro.com/delphi/comevents_e.php Thanks a lot! I'm reading it all and writing some code. But in all of those docs there the InterfaceConnect routine is usedbut I can't find it anywhere. Besides, is there something to convert the tlb to pascal? Or shall I do it manually? I might be wrong, but it seems to me that it should be possible to write a general TSimpleEventSink class which does most of all the COM work, and exposes a pascal-standard event management. The TSimpleEventSink class might have an Events property which is a dynamic array of TNotifyEvents; the client could resize it and link its event handlers. At the same time the TSimpleEventSink reacts to the server events by mapping the dispid's to the Events array index, up to its current maximum dimension. Well, I'm still quite confused besides the missing InterfaceConnect method, is there any freepascal example available? On the web I can only find delphi ones. Thanks, Roberto ___ 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
Re: RE : RE : RE : RE : [fpc-pascal] support for using an activex
2011/5/25 Ludo Brands ludo.bra...@free.fr: Regarding the tlb to pascal conversion, AFAIK there is no support in fpc. Delphi is clearly better equiped to work with COM objects. I have also been playing around with a generic eventsink class but the problem is that events can have parameters (and a lot do). Your suggestion of using TNotifyEvents could work for events without parameters. You could leave the parameter stuff to the user of the eventsink, eventually helping him by exposing the number and type of parameters, but that means that the user has to have a reasonable good understanding of COM, including the data types compatible with COM marshalling. Thanks for the explanation. In fact, that is the reason why I called it TSimpleEventSink, meaning that it was good for simple situation. In my case, for example, the activex controls a hardware stuff which only request the user to take an action sometimes. In the C++ source code for the class Device I have: [ uuid(168F5642-5751-49F5-9AA4-B8A7A5F6A5B8), helpstring(_IDeviceEvents Interface) ] dispinterface _IDeviceEvents { properties: methods: [id(1), helpstring(method OnCommChanged)] HRESULT OnCommChanged(); [id(2), helpstring(method OnStatesChanged)] HRESULT OnStatesChanged(); [id(3), helpstring(method OnContact)] HRESULT OnContact(); [id(4), helpstring(method OnMeasUpdate)] HRESULT OnMeasUpdate(); }; where this four simple events only alert the user about a change situation; then the user takes the suitable actions. Do you think it could work for me? Now I'm trying to write by hand a minimalist tlb, looking for the definitions in the activex source code Thanks a lot!! Roberto ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
RE : RE : RE : RE : RE : [fpc-pascal] support for using an activex
The code in article http://www.informit.com/articles/article.aspx?p=130494seqNum=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!! In the MainForm unit you'll have to do in a TForm1.Create EventSink1:=TEventSink.Create(Self); EventSink1.OnInvoke:=@EventSink1Invoke; because the example assumes you have dropped the component on the form and entered EventSink1Invoke in the properties box. 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; 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 16:01 À : FPC-Pascal users discussions Objet : Re: RE : RE : RE : RE : [fpc-pascal] support for using an activex 2011/5/25 Ludo Brands ludo.bra...@free.fr: Regarding the tlb to pascal conversion, AFAIK there is no support in fpc. Delphi is clearly better equiped to work with COM objects. I have also been playing around with a generic eventsink class but the problem is that events can have parameters (and a lot do). Your suggestion of using TNotifyEvents could work for events without parameters. You could leave the parameter stuff to the user of the eventsink, eventually helping him by exposing the number and type of parameters, but that means that the user has to have a reasonable good understanding of COM, including the data types compatible with COM marshalling. Thanks for the explanation. In fact, that is the reason why I called it TSimpleEventSink, meaning that it was good for simple situation. In my case, for example, the activex controls a hardware stuff which only request the user to take an action sometimes. In the C++ source code for the class Device I have: [ uuid(168F5642-5751-49F5-9AA4-B8A7A5F6A5B8), helpstring(_IDeviceEvents Interface) ] dispinterface _IDeviceEvents { properties: methods: [id(1), helpstring(method OnCommChanged)] HRESULT OnCommChanged(); [id(2), helpstring(method OnStatesChanged)] HRESULT OnStatesChanged(); [id(3), helpstring(method OnContact)] HRESULT OnContact(); [id(4), helpstring(method OnMeasUpdate)] HRESULT OnMeasUpdate(); }; where this four simple events only alert the user about a change situation; then the user takes the suitable actions. Do you think it could work for me? Now I'm trying to write by hand a minimalist tlb, looking for the definitions in the activex source code Thanks a lot!! Roberto ___ 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
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=130494seqNum=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
RE : RE : RE : RE : RE : RE : [fpc-pascal] support for using an activex
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=130494seqNum=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
Re: RE : RE : RE : RE : RE : RE : [fpc-pascal] support for using an activex
Always thanks! Given your evident experience on this matter, I kindly ask your advice on what is best to do. opt 1) create a fpc class with some pascal style methods, which in their implementation use variants and call the IDevice class with late-binding . meaning that there is no compiler check and if my collegue changes the dll, then I have to change these implementations opt 2) in a reference of those you sent me, there is some example code from which I take the lines below. In the tlb conversion unit, the interface and dispinterface of the class are some replicated. Then also the eventinterface is defined. The main interface class is defined without and with dispids. With the dispids, only the properties are defined and not the methods. IFileZapper = interface(IDispatch) ['{2E2FC5E0-5C0E-4C4F-8CC1-D9F6C5A92BA6}'] function Get_Directory: WideString; safecall; procedure Set_Directory(const Value: WideString); safecall; function Get_FileMask: WideString; safecall; procedure Set_FileMask(const Value: WideString); safecall; procedure BringToFront; safecall; property Directory: WideString read Get_Directory write Set_Directory; property FileMask: WideString read Get_FileMask write Set_FileMask; end; IFileZapperDisp = dispinterface ['{2E2FC5E0-5C0E-4C4F-8CC1-D9F6C5A92BA6}'] property Directory: WideString dispid 1; property FileMask: WideString dispid 3; procedure BringToFront; dispid 10; end; IFileZapperEvents = dispinterface ['{7B6F8ADD-7980-4A35-838B-E1600C43D29E}'] procedure OnSelectionChanged; dispid 1; procedure OnDirectoryChanged(const DirName: WideString); dispid 2; end; Is this somewhat the same thing as the wrapper of option 1? If I write all of this conversion (and, by the way, how to convert C++ data types to pascal?? widestring ?), then how can I use it? In the end, maybe the wiki page about COM interfaces should be update to something more than 'Word.Application.NewFile'. I can't share the activex I have, otherwise it would be a good example to see something useful to start with. 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=130494seqNum=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
Re: RE : RE : [fpc-pascal] support for using an activex
Thanks a lot! I've been able to create the object and connect to my device.. and even reading some strings! This FPC + ActiveX stuff is really cool. Don't know if your ActiveX sends events that you want to catch. Creating event sinks is relatively complex. Yes, the most important thing is fired as an event. So, at least, I have to try that... Com reference information can be found here: http://msdn.microsoft.com/en-us/library/ms221375.aspx Basically, I didn't understand anything over there. Probably I should read a lot more of docs, but also the content organization is not clear to me. Does anyone have a code example of this event sinking ? Thanks anyway, Roberto 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é : lundi 23 mai 2011 15:07 À : FPC-Pascal users discussions Objet : Re: RE : [fpc-pascal] support for using an activex Wow, this sound like good news! The activex I have is not visual; it is simply a class that creates a thread in which a physical device is controlled through a serial port, with a particular protocol. The class then has methods like Open channel, Read Mesaure, and so on. Is there any documentation I can read? I think I have to translate some header files to understand the exchanged data...or shall I use only variant ? I suppose I have to change MSWord := CreateOleObject('Word.Application'); into something related to my class; where do I discover the name.surname ? Thanks all! 2011/5/23 Ludo Brands ludo.bra...@free.fr: If the activex is not a visual control that you want to put on a LCL form you can use CreateOleObject. Note that you don't load ActiveX dll's directly. ActiveX objects are registered in Windows by the installer or manually with Regsvr32.exe. Windows loads the ddl for you when you call CreateOleObject. Ole components are reference counted and released when not used anymore. Here is a simple sample program when you have MS Word installed. program Project1; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { you can add units after this } ,sysutils,ComObj; {$R *.res} var MSWord,WordDoc,WordPara: Variant; begin MSWord := CreateOleObject('Word.Application'); MSWord.Visible:=true; WordDoc := MSWord.Documents.Add; WordDoc.Activate; WordPara := WordDoc.Content.Paragraphs.Add; WordPara.Range.Text := 'Hello World!'; WordDoc.SaveAs('C:\Test.Doc'); Sleep(1); WordDoc.Close(False); MSWord.Quit; MSWord := Unassigned; WordDoc := Unassigned; WordPara := Unassigned; end. -Message d'origine- De : fpc-pascal-boun...@lists.freepascal.org [mailto:fpc-pascal-boun...@lists.freepascal.org] De la part de Roberto Padovani Envoyé : lundi 23 mai 2011 12:24 À : FPC-Pascal users discussions Objet : [fpc-pascal] support for using an activex Hi List! I looked around the archives and forum, but I didn't come up with a clear answer. Besides, I'm not expert of the win32 and COM world. If I am given an ActiveX, with source code included, is it possible to using from a freepascal / lazarus app like any other dll? I mean loading the dll, instantiating the object and calling some methods. If so, can anyone point me to some documentation or example? Thanks a lot, Roberto ___ 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 ___ 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
RE : RE : RE : [fpc-pascal] support for using an activex
The following delphi articles should help creating an event sink: http://www.informit.com/articles/article.aspx?p=130494seqNum=5 This is an interesting one since it is written for Delphi 3-4 which missed a lot of the automated COM handling. This is much closer to where fpc is now. http://www.blong.com/Conferences/IConUK2000/DelphiMoreAutomation/More%20Auto mation%20In%20Delphi.htm#HandcraftedEventSink A good intruduction to connectable objects: http://www.gtro.com/delphi/comevents_e.php 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é : mardi 24 mai 2011 11:24 À : FPC-Pascal users discussions Objet : Re: RE : RE : [fpc-pascal] support for using an activex Thanks a lot! I've been able to create the object and connect to my device.. and even reading some strings! This FPC + ActiveX stuff is really cool. Don't know if your ActiveX sends events that you want to catch. Creating event sinks is relatively complex. Yes, the most important thing is fired as an event. So, at least, I have to try that... Com reference information can be found here: http://msdn.microsoft.com/en-us/library/ms221375.aspx Basically, I didn't understand anything over there. Probably I should read a lot more of docs, but also the content organization is not clear to me. Does anyone have a code example of this event sinking ? Thanks anyway, Roberto 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é : lundi 23 mai 2011 15:07 À : FPC-Pascal users discussions Objet : Re: RE : [fpc-pascal] support for using an activex Wow, this sound like good news! The activex I have is not visual; it is simply a class that creates a thread in which a physical device is controlled through a serial port, with a particular protocol. The class then has methods like Open channel, Read Mesaure, and so on. Is there any documentation I can read? I think I have to translate some header files to understand the exchanged data...or shall I use only variant ? I suppose I have to change MSWord := CreateOleObject('Word.Application'); into something related to my class; where do I discover the name.surname ? Thanks all! 2011/5/23 Ludo Brands ludo.bra...@free.fr: If the activex is not a visual control that you want to put on a LCL form you can use CreateOleObject. Note that you don't load ActiveX dll's directly. ActiveX objects are registered in Windows by the installer or manually with Regsvr32.exe. Windows loads the ddl for you when you call CreateOleObject. Ole components are reference counted and released when not used anymore. Here is a simple sample program when you have MS Word installed. program Project1; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { you can add units after this } ,sysutils,ComObj; {$R *.res} var MSWord,WordDoc,WordPara: Variant; begin MSWord := CreateOleObject('Word.Application'); MSWord.Visible:=true; WordDoc := MSWord.Documents.Add; WordDoc.Activate; WordPara := WordDoc.Content.Paragraphs.Add; WordPara.Range.Text := 'Hello World!'; WordDoc.SaveAs('C:\Test.Doc'); Sleep(1); WordDoc.Close(False); MSWord.Quit; MSWord := Unassigned; WordDoc := Unassigned; WordPara := Unassigned; end. -Message d'origine- De : fpc-pascal-boun...@lists.freepascal.org [mailto:fpc-pascal-boun...@lists.freepascal.org] De la part de Roberto Padovani Envoyé : lundi 23 mai 2011 12:24 À : FPC-Pascal users discussions Objet : [fpc-pascal] support for using an activex Hi List! I looked around the archives and forum, but I didn't come up with a clear answer. Besides, I'm not expert of the win32 and COM world. If I am given an ActiveX, with source code included, is it possible to using from a freepascal / lazarus app like any other dll? I mean loading the dll, instantiating the object and calling some methods. If so, can anyone point me to some documentation or example? Thanks a lot, Roberto ___ 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 ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal ___ fpc-pascal maillist - fpc-pascal
RE : RE : RE : [fpc-pascal] support for using an activex
OOPS. Wrong key -Message d'origine- De : fpc-pascal-boun...@lists.freepascal.org [mailto:fpc-pascal-boun...@lists.freepascal.org] De la part de Ludo Brands Envoyé : lundi 23 mai 2011 15:33 À : 'FPC-Pascal users discussions' Objet : RE : RE : [fpc-pascal] support for using an activex When using -Message d'origine- De : fpc-pascal-boun...@lists.freepascal.org [mailto:fpc-pascal-boun...@lists.freepascal.org] De la part de Roberto Padovani Envoyé : lundi 23 mai 2011 15:07 À : FPC-Pascal users discussions Objet : Re: RE : [fpc-pascal] support for using an activex Wow, this sound like good news! The activex I have is not visual; it is simply a class that creates a thread in which a physical device is controlled through a serial port, with a particular protocol. The class then has methods like Open channel, Read Mesaure, and so on. Is there any documentation I can read? I think I have to translate some header files to understand the exchanged data...or shall I use only variant ? I suppose I have to change MSWord := CreateOleObject('Word.Application'); into something related to my class; where do I discover the name.surname ? Thanks all! 2011/5/23 Ludo Brands ludo.bra...@free.fr: If the activex is not a visual control that you want to put on a LCL form you can use CreateOleObject. Note that you don't load ActiveX dll's directly. ActiveX objects are registered in Windows by the installer or manually with Regsvr32.exe. Windows loads the ddl for you when you call CreateOleObject. Ole components are reference counted and released when not used anymore. Here is a simple sample program when you have MS Word installed. program Project1; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { you can add units after this } ,sysutils,ComObj; {$R *.res} var MSWord,WordDoc,WordPara: Variant; begin MSWord := CreateOleObject('Word.Application'); MSWord.Visible:=true; WordDoc := MSWord.Documents.Add; WordDoc.Activate; WordPara := WordDoc.Content.Paragraphs.Add; WordPara.Range.Text := 'Hello World!'; WordDoc.SaveAs('C:\Test.Doc'); Sleep(1); WordDoc.Close(False); MSWord.Quit; MSWord := Unassigned; WordDoc := Unassigned; WordPara := Unassigned; end. -Message d'origine- De : fpc-pascal-boun...@lists.freepascal.org [mailto:fpc-pascal-boun...@lists.freepascal.org] De la part de Roberto Padovani Envoyé : lundi 23 mai 2011 12:24 À : FPC-Pascal users discussions Objet : [fpc-pascal] support for using an activex Hi List! I looked around the archives and forum, but I didn't come up with a clear answer. Besides, I'm not expert of the win32 and COM world. If I am given an ActiveX, with source code included, is it possible to using from a freepascal / lazarus app like any other dll? I mean loading the dll, instantiating the object and calling some methods. If so, can anyone point me to some documentation or example? Thanks a lot, Roberto ___ 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 ___ 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