Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2011-05

support for using an activex

34 messages · 4 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Roberto Padovani

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

Henrik Genssen
to Roberto Padovani

it depends.
Active-X / COM objects with no window can be created using: CreateOleObject() function

Active-X / OLE objects do not work as far as I remember

regards

Henrik

Show quoted text 25 lines
reply to message: date: 23.05.2011 12:23:35 from: "Roberto Padovani" to: "FPC-Pascal users discussions" subject: [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 - http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Felipe Monteiro de Carvalho
to Henrik Genssen
Henrik Genssen wrote
Active-X / OLE objects do not work as far as I remember

I don't think that it is a matter of not working (as in something that stops it from working), but rather that noone has researched and developed an way to make that work.

Felipe Monteiro de Carvalho
Ludo Brands
to Roberto Padovani: Hi List! I looked around the archives and forum, but I didn't come up with a clear answer.

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(10000);
  WordDoc.Close(False);
  MSWord.Quit;
  MSWord := Unassigned;
  WordDoc := Unassigned;
  WordPara := Unassigned;
end.
Earlier message 23 lines
-----Message d'origine----- De : 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
Roberto Padovani
to Ludo Brands

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 :

Show quoted text 75 lines
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(10000);  WordDoc.Close(False);  MSWord.Quit;  MSWord := Unassigned;  WordDoc := Unassigned;  WordPara := Unassigned; end. -----Message d'origine----- De : 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  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal _______________________________________________ fpc-pascal maillist  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Ludo Brands
to Roberto Padovani

When using

Earlier message 101 lines
-----Message d'origine----- De : 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 : > 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(10000); >  WordDoc.Close(False); >  MSWord.Quit; >  MSWord := Unassigned; >  WordDoc := Unassigned; >  WordPara := Unassigned; > end. > > > > -----Message d'origine----- > De : > 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  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal >
Ludo Brands
to Roberto Padovani: Wow, this sound like good news! The activex I have is not visual; it is "simply" a class…

When using CreateOleObject you are using what they call late binding. During compile time you don't know what methods the object support. The object is queried for its interfaces, methods and header file translations needed except when custom data types are defined. The use of variants is definitely recommended. Variants are mandatory to store the reference to the OleObject.

If you know the CLSID of the ACTIVEX Object (should be in the header file describing the interface) and the object is registered you can find the ProgID easily in the registry. For Word.Application {000209FF-0000-0000-C000-000000000046} you find it under HKEY_CLASSES_ROOT\CLSID\{000209FF-0000-0000-C000-000000000046}\VersionIndepe ndentProgID.
If you have the sources of the ActiveX Object you should find the progID in there also.

Don't know if your ActiveX sends events that you want to catch. Creating "event sinks" is relatively complex.

Com reference information can be found here:
http://msdn.microsoft.com/en-us/library/ms221375.aspx

Ludo

Earlier message 101 lines
-----Message d'origine----- De : 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 : > 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(10000); >  WordDoc.Close(False); >  MSWord.Quit; >  MSWord := Unassigned; >  WordDoc := Unassigned; >  WordPara := Unassigned; > end. > > > > -----Message d'origine----- > De : > 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  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal >
Ludo Brands
to Ludo Brands: When using -----Message d'origine----- De : De la part de Roberto Padovani Envoyé :…

OOPS. Wrong key

Earlier message 110 lines
-----Message d'origine----- De : 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 : 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 : > 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(10000); >  WordDoc.Close(False); >  MSWord.Quit; >  MSWord := Unassigned; >  WordDoc := Unassigned; >  WordPara := Unassigned; > end. > > > > -----Message d'origine----- > De : > 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  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal >
Roberto Padovani
to Ludo Brands: When using CreateOleObject you are using what they call late binding. During compile time…

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

Show quoted text 112 lines
Ludo -----Message d'origine----- De : 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 : > 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(10000); >  WordDoc.Close(False); >  MSWord.Quit; >  MSWord := Unassigned; >  WordDoc := Unassigned; >  WordPara := Unassigned; > end. > > > > -----Message d'origine----- > De : > 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  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > _______________________________________________ fpc-pascal maillist  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal _______________________________________________ fpc-pascal maillist  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Ludo Brands
to Roberto Padovani

The following delphi articles should help creating an event sink:

http://www.informit.com/articles/article.aspx?p=130494&seqNum=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

Earlier message 143 lines
-----Message d'origine----- De : 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 : > 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 : >> 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(10000); >>  WordDoc.Close(False); >>  MSWord.Quit; >>  MSWord := Unassigned; >>  WordDoc := Unassigned; >>  WordPara := Unassigned; >> end. >> >> >> >> -----Message d'origine----- >> De : >> 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  -   >> http://lists.freepascal.org/mailman/listinfo/fpc-pascal >> >> _______________________________________________ >> fpc-pascal maillist  -   >> http://lists.freepascal.org/mailman/listinfo/fpc-pascal >> > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal >
Roberto Padovani
to Ludo Brands

2011/5/24 Ludo Brands :

Show quoted text 12 lines
The following delphi articles should help creating an event sink: http://www.informit.com/articles/article.aspx?p=130494&seqNum=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 used....but 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

Ludo Brands
to Roberto Padovani

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

Earlier message 47 lines
-----Message d'origine----- De : 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 : > The following delphi articles should help creating an event sink: > > http://www.informit.com/articles/article.aspx?p=130494&seqNum=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 used....but 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
Ludo Brands
to Roberto Padovani: 2011/5/24 Ludo Brands : Thanks a lot! I'm reading it all and writing some code. But in…

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.

Simply mapping dispid's to array index isn't working for all real life
ActiveX objects. Take a
  _CoolBarDisp = dispinterface
    ['{38911D91-E448-11D0-84A3-00DD01104159}']
    procedure GhostMethod__CoolBar_28_0; dispid 1610743808;
    procedure GhostMethod__CoolBar_32_1; dispid 1610743809;
...
    procedure OLEDrag; dispid 1610809364;
    procedure Refresh; dispid -550;
    procedure AboutBox; dispid -552;
  end;

Delphi solves the problem not by creating a generic eventsink type but by creating a pascal wrapper with the "import ActiveX control" tool. All parameters are already converted to the correct types. Here the user doesn't need to understand is an excerpt of the Delphi conversion of the aol winampxchat library (only event related stuff):
Type
TIWinAmpActiveXChatWinampMsgEvent = procedure(Sender: TObject; msgId: Integer) of object;
TIWinAmpActiveXChatWinampStatus = procedure(Sender: TObject; msgId: Integer; comp: Integer) of object;

  TIWinAmpActiveXChat = class(TOleControl)
  private
    FOnWinampMsgEvent: TIWinAmpActiveXChatWinampMsgEvent;
    FOnWinampStatus: TIWinAmpActiveXChatWinampStatus;
...
  published
...
    property OnWinampMsgEvent: TIWinAmpActiveXChatWinampMsgEvent read
FOnWinampMsgEvent write FOnWinampMsgEvent;
    property OnWinampStatus: TIWinAmpActiveXChatWinampStatus read
FOnWinampStatus write FOnWinampStatus;
  end;
procedure TIWinAmpActiveXChat.InitControlData;
const
  CEventDispIDs: array [0..1] of DWORD = (
    $00000001, $00000002);
  CControlData: TControlData2 = (
    ClassID: '{E3852604-B619-11D6-94EC-00047521F020}';
    EventIID: '{E3852603-B619-11D6-94EC-00047521F020}';
    EventCount: 2;
    EventDispIDs: @CEventDispIDs;
    LicenseKey: nil (*HR:$80004002*);
    Flags: $00000000;
    Version: 401);
begin
  ControlData := @CControlData;
  TControlData2(CControlData).FirstEventOfs := Cardinal(@@FOnWinampMsgEvent)
- Cardinal(Self);
end;

Note CEventDispIDs which holds the dispid values. When an event is invoked the DISPID is looked up in CEventDispIDs. The index is used to calculate an offset with FOnWinampMsgEvent. Index 0 points to FOnWinampMsgEvent, 1 to FOnWinampStatus,...

Ludo

Earlier message 47 lines
-----Message d'origine----- De : 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 : > The following delphi articles should help creating an event sink: > > http://www.informit.com/articles/article.aspx?p=130494&seqNum=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 used....but 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
Roberto Padovani
to Ludo Brands

2011/5/25 Ludo Brands :

Show quoted text 11 lines
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

Ludo Brands
to Roberto Padovani

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!! In the MainForm unit you'll have to do in a TForm1.Create

EventSink1:=TEventSink.Create(Self);
;

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

Earlier message 52 lines
-----Message d'origine----- De : 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 : > 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
Roberto Padovani
to Ludo Brands

2011/5/25 Ludo Brands :

Show quoted text 6 lines
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!

Show quoted text 17 lines
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#

Ludo Brands
to Roberto Padovani

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

Earlier message 61 lines
-----Message d'origine----- De : 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 : > 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#
Roberto Padovani
to Ludo Brands

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 :

Show quoted text 89 lines
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 : 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 : > 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  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal _______________________________________________ fpc-pascal maillist  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Ludo Brands
to Roberto Padovani

The late binding method is more robust against interface changes than early binding. Example: changing dispids won't affect late binding. Once a com object is deployed, normally interfaces aren't modified (other than adding new methods with new dispids) but new interfaces are added. Reason why there are so many interfaces call ISomething2 or ISomething_V2. As long as you are in the development phase, it is just a matter of talking to your collegues, isn't it?
The decision on early or late binding is in most cases determined by the overhead late binding is causing. If this is an in-process com object late binding is many times slower than early binding. Early binding will use VTABLE info and call the methods directly. For out-of-process objects the performance difference is less striking because of data marshalling.

IFileZapper and IFileZapperDisp are 2 descriptions for the same interface (dual interface). IFileZapper allows for direct access to the methods and properties. Dispinterface is used for late binding and is used to avoid querying the interface to discover methods.

Because of data marshalling you can only use datatypes that can be marshalled. Strings have to in the BSTR format which is compatible with fpc WideString. Take a is a table just before the
definition of VT_EMPTY (line 296). Types marked with [S] can be marshalled automatically (ie late binding).

Ludo

Earlier message 151 lines
-----Message d'origine----- De : De la part de Roberto Padovani Envoyé : mercredi 25 mai 2011 22:52 À : FPC-Pascal users discussions Objet : Re: RE : RE : RE : RE : RE : RE : [fpc-pascal] support for using anactivex 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 : > Using variants you can transparently "walk" along the exposed objects. > The variant contains the Idispatch of the object and gets the exposed > 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 : > 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 : >> 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  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal >
Ludo Brands
to Roberto Padovani: Always thanks! Given your evident experience on this matter, I kindly ask your advice on…

Attached a small lazarus demo project that implements the EventSink unit. It is based on the EventSink unit in the article and adapted for fpc. The demo launches Msword and connects to the ApplicationEvents interface {000209F7-0000-0000-C000-000000000046}. When you create a new document, or change document, close word etc. in msword the app displays in a memo the dispids received through the event sink.

As you will notice, the dispinterface for the events interface just contains the guid. No method prototypes are required.

Ludo

Roberto Padovani
to Ludo Brands

Wow, thanks again for the explanation and the example! I'm working on that....and it starts beating....

By the way, after this:

FDevice := GetActiveOleObject(OLE_OBJECT_NAME);

how can i test that everything is ok and FDevice is valid ? something like:

ok := FDevice  nil;

Roberto

2011/5/26 Ludo Brands :

Show quoted text 17 lines
Attached a small lazarus demo project that implements the EventSink unit. It is based on the EventSink unit in the article and adapted for fpc. The demo launches Msword and connects to the ApplicationEvents interface {000209F7-0000-0000-C000-000000000046}. When you create a new document, or change document, close word etc. in msword the app displays in a memo the dispids received through the event sink. As you will notice, the dispinterface for the events interface just contains the guid. No method prototypes are required. Ludo _______________________________________________ fpc-pascal maillist  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Ludo Brands
to Roberto Padovani

GetActiveOleObject raises EOleSysError if it fails.

Earlier message 41 lines
-----Message d'origine----- De : De la part de Roberto Padovani Envoyé : jeudi 26 mai 2011 17:32 À : FPC-Pascal users discussions Objet : Re: RE : RE : RE : RE : RE : RE : RE : [fpc-pascal] support for usinganactivex Wow, thanks again for the explanation and the example! I'm working on that....and it starts beating.... By the way, after this: FDevice := GetActiveOleObject(OLE_OBJECT_NAME); how can i test that everything is ok and FDevice is valid ? something like: ok := FDevice nil; Roberto 2011/5/26 Ludo Brands : > Attached a small lazarus demo project that implements the EventSink > unit. It is based on the EventSink unit in the article and adapted for > fpc. The demo launches Msword and connects to the ApplicationEvents > interface {000209F7-0000-0000-C000-000000000046}. When you create a > new document, or change document, close word etc. in msword the app > displays in a memo the dispids received through the event sink. > > As you will notice, the dispinterface for the events interface just > contains the guid. No method prototypes are required. > > Ludo > > > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal >
Roberto Padovani
to Ludo Brands

It's nearly finished and nearly working.
I was wondering this: is there a way to query the version and helpstring of an activex, once I created it ?

R#

2011/5/26 Ludo Brands :

Show quoted text 51 lines
GetActiveOleObject raises EOleSysError if it fails. -----Message d'origine----- De : De la part de Roberto Padovani Envoyé : jeudi 26 mai 2011 17:32 À : FPC-Pascal users discussions Objet : Re: RE : RE : RE : RE : RE : RE : RE : [fpc-pascal] support for usinganactivex Wow, thanks again for the explanation and the example! I'm working on that....and it starts beating.... By the way, after this: FDevice := GetActiveOleObject(OLE_OBJECT_NAME); how can i test that everything is ok and FDevice is valid ? something like: ok := FDevice nil; Roberto 2011/5/26 Ludo Brands : > Attached a small lazarus demo project that implements the EventSink > unit. It is based on the EventSink unit in the article and adapted for > fpc. The demo launches Msword and connects to the ApplicationEvents > interface {000209F7-0000-0000-C000-000000000046}. When you create a > new document, or change document, close word etc. in msword the app > displays in a memo the dispids received through the event sink. > > As you will notice, the dispinterface for the events interface just > contains the guid. No method prototypes are required. > > Ludo > > > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > _______________________________________________ fpc-pascal maillist  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal _______________________________________________ fpc-pascal maillist  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Ludo Brands
to Roberto Padovani

There is no standard way of getting the information directly from the activex object. You can ask your collegues to implement these properties (should be straightforeward).
For activex objects that are installed on your computer you can find the info here:
HKEY_CLASSES_ROOT\CLSID\clsid-of-your-object\ (helpstring) HKEY_CLASSES_ROOT\CLSID\clsid-of-your-object\version\ (version)

Ludo

Earlier message 69 lines
-----Message d'origine----- De : De la part de Roberto Padovani Envoyé : vendredi 27 mai 2011 13:47 À : FPC-Pascal users discussions Objet : Re: RE : RE : RE : RE : RE : RE : RE : RE : [fpc-pascal] support forusinganactivex It's nearly finished and nearly working. I was wondering this: is there a way to query the version and helpstring of an activex, once I created it ? R# 2011/5/26 Ludo Brands : > GetActiveOleObject raises EOleSysError if it fails. > > -----Message d'origine----- > De : > De la part de Roberto > Padovani Envoyé : jeudi 26 mai 2011 17:32 > À : FPC-Pascal users discussions > Objet : Re: RE : RE : RE : RE : RE : RE : RE : [fpc-pascal] support for > usinganactivex > > > Wow, thanks again for the explanation and the example! > I'm working on that....and it starts beating.... > > By the way, after this: > > FDevice := GetActiveOleObject(OLE_OBJECT_NAME); > > how can i test that everything is ok and FDevice is valid ? something > like: > > ok := FDevice nil; > > Roberto > > 2011/5/26 Ludo Brands : >> Attached a small lazarus demo project that implements the EventSink >> unit. It is based on the EventSink unit in the article and adapted >> for fpc. The demo launches Msword and connects to the >> ApplicationEvents interface {000209F7-0000-0000-C000-000000000046}. >> When you create a new document, or change document, close word etc. >> in msword the app displays in a memo the dispids received through the >> event sink. >> >> As you will notice, the dispinterface for the events interface just >> contains the guid. No method prototypes are required. >> >> Ludo >> >> >> _______________________________________________ >> fpc-pascal maillist  -   >> http://lists.freepascal.org/mailman/listinfo/fpc-pascal >> > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal >
Roberto Padovani
to Ludo Brands

2011/5/27 Ludo Brands :

There is no standard way of getting the information directly from the activex object. You can ask your collegues to implement these properties (should be straightforeward).

Last time I (hardware engineer) asked for a minor change in a library, they estimated 2 years work.
For every electronic board I design, I also write 3 or 4 software to test it, so I'm sure it was a minor change.

Show quoted text 5 lines
For activex objects that are installed on your computer you can find the info here: HKEY_CLASSES_ROOT\CLSID\clsid-of-your-object\    (helpstring) HKEY_CLASSES_ROOT\CLSID\clsid-of-your-object\version\   (version)

I'll go for the registry! Thanks!

Show quoted text 80 lines
Ludo -----Message d'origine----- De : De la part de Roberto Padovani Envoyé : vendredi 27 mai 2011 13:47 À : FPC-Pascal users discussions Objet : Re: RE : RE : RE : RE : RE : RE : RE : RE : [fpc-pascal] support forusinganactivex It's nearly finished and nearly working. I was wondering this: is there a way to query the version and helpstring of an activex, once I created it ? R# 2011/5/26 Ludo Brands : > GetActiveOleObject raises EOleSysError if it fails. > > -----Message d'origine----- > De : > De la part de Roberto > Padovani Envoyé : jeudi 26 mai 2011 17:32 > À : FPC-Pascal users discussions > Objet : Re: RE : RE : RE : RE : RE : RE : RE : [fpc-pascal] support for > usinganactivex > > > Wow, thanks again for the explanation and the example! > I'm working on that....and it starts beating.... > > By the way, after this: > > FDevice := GetActiveOleObject(OLE_OBJECT_NAME); > > how can i test that everything is ok and FDevice is valid ? something > like: > > ok := FDevice nil; > > Roberto > > 2011/5/26 Ludo Brands : >> Attached a small lazarus demo project that implements the EventSink >> unit. It is based on the EventSink unit in the article and adapted >> for fpc. The demo launches Msword and connects to the >> ApplicationEvents interface {000209F7-0000-0000-C000-000000000046}. >> When you create a new document, or change document, close word etc. >> in msword the app displays in a memo the dispids received through the >> event sink. >> >> As you will notice, the dispinterface for the events interface just >> contains the guid. No method prototypes are required. >> >> Ludo >> >> >> _______________________________________________ >> fpc-pascal maillist  -   >> http://lists.freepascal.org/mailman/listinfo/fpc-pascal >> > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > _______________________________________________ fpc-pascal maillist  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal _______________________________________________ fpc-pascal maillist  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Roberto Padovani
to Ludo Brands: Using variants you can transparently "walk" along the exposed objects. The variant…

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 :

Show quoted text 89 lines
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 : 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 : > 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  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal _______________________________________________ fpc-pascal maillist  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Ludo Brands
to Roberto Padovani

Use Item(i). Item(long Index, [out, retval] ITransducer* *pVal); means method with 1 input Index and Output Itransducer^.

Ludo

Show quoted text 173 lines
-----Message d'origine----- De : 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 : > Using variants you can transparently "walk" along the exposed objects. > The variant contains the Idispatch of the object and gets the exposed > 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 : > 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 : >> 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  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > _______________________________________________ fpc-pascal maillist - http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Roberto Padovani
to Ludo Brands
With the round bracket        item := items.item(1);
it crasches saying "Cannot find member"

I am declaring only variants as you suggested....maybe for collections I have to declare explicitely some interfaces? I tried without success, but not knowing COM at all, I might have written something wrong.

I've seen around variants and olevariants...??
Could it be an error or non-standard implementation of the dll ?

I'm loosing confidence.....

Thanks anyway!!

R#

2011/5/30 Ludo Brands :

Show quoted text 183 lines
Use Item(i). Item(long Index, [out, retval] ITransducer* *pVal); means method with 1 input Index and Output Itransducer^. Ludo > -----Message d'origine----- > De : > 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 : > > Using variants you can transparently "walk" along the > exposed objects. > > The variant contains the Idispatch of the object and gets > the exposed > > 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 : > > 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 : > >> 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  -   > > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > > > > _______________________________________________ > > fpc-pascal maillist  -   > > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > > > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > _______________________________________________ fpc-pascal maillist  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Ludo Brands
to Roberto Padovani
With the round bracket item := items.item(1); it crasches saying "Cannot find member"

Difficult to debug without having the dll. If item := items.item[1]; raises a "wrong number of parameters then the items.item member is found. I don't understand why items.item(1) raises a
"Cannot find member". COM methods are normally case insensitive.

I am declaring only variants as you suggested....maybe for collections I have to declare explicitely some interfaces?
I didn't notice the id(DISPID_VALUE) in the Item declaration. This means
that item:=items(i) should work also. Don't know if fpc supports this.

Ludo

Ludo Brands
to Roberto Padovani: With the round bracket item := items.item(1); it crasches saying "Cannot find…

I created a small automation object with following IDL (part of it):

   interface ItestAX: IDispatch
  {
    [
    propget,
    id(0x00000001)
    ]
    HRESULT _stdcall Devices([out, retval] IDevices ** Value );
  };
   interface IIDevices: IDispatch
  {
    [
    propget,
    id(0x00000000)
    ]
    HRESULT _stdcall Device([in] long Idx, [out, retval] IDevice ** Value );
    [
    propget,
    id(0x00000002)
    ]
    HRESULT _stdcall Count([out, retval] long * Value );
  };
   interface IIDevice: IDispatch
  {
    [
    propget,
    id(0x00000001)
    ]
    HRESULT _stdcall Name([out, retval] BSTR * Value );
  };

This matches pretty much the interface you described earlier. Note the id(0x00000000) which makes Device the default member of IIDevices. This is the same as id(DISPID_VALUE) in your case.

Now, the following lines do work for me to get the Name member of IIDevice (ActX,a,b:variant;s:string):

  ActX:=CreateOleObject(MyTestControl);
  a:=ActX.Devices;
  b:=a.Device[3];
  s:=b.Name;
  b:=ActX.Devices.Device[3];
  s:=b.Name;
  b:=ActX.Devices[3];
  s:=b.Name;

Note that the default member does work correctly:
Devices.Device[3]===Devices[3].

I'm using fpc 2.5.1 svn 17599.

Ludo

Roberto Padovani
to Ludo Brands

Thanks, I'll try installing a more recent fpc and lazarus...

2011/5/30 Ludo Brands :

Show quoted text 61 lines
I created a small automation object with following IDL (part of it):   interface ItestAX: IDispatch  {    [    propget,    id(0x00000001)    ]    HRESULT _stdcall Devices([out, retval] IDevices ** Value );  };   interface IIDevices: IDispatch  {    [    propget,    id(0x00000000)    ]    HRESULT _stdcall Device([in] long Idx, [out, retval] IDevice ** Value );    [    propget,    id(0x00000002)    ]    HRESULT _stdcall Count([out, retval] long * Value );  };   interface IIDevice: IDispatch  {    [    propget,    id(0x00000001)    ]    HRESULT _stdcall Name([out, retval] BSTR * Value );  }; This matches pretty much the interface you described earlier. Note the id(0x00000000) which makes Device the default member of IIDevices. This is the same as id(DISPID_VALUE) in your case. Now, the following lines do work for me to get the Name member of IIDevice (ActX,a,b:variant;s:string):  ActX:=CreateOleObject(MyTestControl);  a:=ActX.Devices;  b:=a.Device[3];  s:=b.Name;  b:=ActX.Devices.Device[3];  s:=b.Name;  b:=ActX.Devices[3];  s:=b.Name; Note that the default member does work correctly: Devices.Device[3]===Devices[3]. I'm using fpc 2.5.1 svn 17599. Ludo _______________________________________________ fpc-pascal maillist  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Roberto Padovani
to Roberto Padovani

I triede with fpc 2.4.4 but nothing changes. Would you mind having a look a the full dll with your more recent fpc?
By the way, how do I install fpc 2.5.x ??
I might send it to you privately; the only trouble is that you don't have a real hardware to connect it, even if the transducers class are created during the main device creation and their count and status are (should) always be available even if not connected.

A test case would simply:
1) createoleobject //OK
2) object.transducers.count // OK, always 8
3) object.transducers(1).Status // ???? should be an integer, not a crash !!!

R#

2011/5/31 Roberto Padovani :

Show quoted text 67 lines
Thanks, I'll try installing a more recent fpc and lazarus... 2011/5/30 Ludo Brands : > I created a small automation object with following IDL (part of it): > >   interface ItestAX: IDispatch >  { >    [ >    propget, >    id(0x00000001) >    ] >    HRESULT _stdcall Devices([out, retval] IDevices ** Value ); >  }; > >   interface IIDevices: IDispatch >  { >    [ >    propget, >    id(0x00000000) >    ] >    HRESULT _stdcall Device([in] long Idx, [out, retval] IDevice ** Value ); >    [ >    propget, >    id(0x00000002) >    ] >    HRESULT _stdcall Count([out, retval] long * Value ); >  }; > >   interface IIDevice: IDispatch >  { >    [ >    propget, >    id(0x00000001) >    ] >    HRESULT _stdcall Name([out, retval] BSTR * Value ); >  }; > > This matches pretty much the interface you described earlier. Note the > id(0x00000000) which makes Device the default member of IIDevices. This is > the same as id(DISPID_VALUE) in your case. > > Now, the following lines do work for me to get the Name member of IIDevice > (ActX,a,b:variant;s:string): > >  ActX:=CreateOleObject(MyTestControl); >  a:=ActX.Devices; >  b:=a.Device[3]; >  s:=b.Name; >  b:=ActX.Devices.Device[3]; >  s:=b.Name; >  b:=ActX.Devices[3]; >  s:=b.Name; > > Note that the default member does work correctly: > Devices.Device[3]===Devices[3]. > > I'm using fpc 2.5.1 svn 17599. > > Ludo > > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal >
Ludo Brands
to Roberto Padovani

You can send me the file directly. Address is in the message.

To install fpc from svn: http://wiki.lazarus.freepascal.org/Getting_Lazarus has good instructions.

Ludo

Show quoted text 104 lines
-----Message d'origine----- De : De la part de Roberto Padovani Envoyé : mardi 31 mai 2011 17:41 À : FPC-Pascal users discussions Objet : Re: RE : RE : RE : RE : RE : RE : RE : RE : [fpc-pascal] support forusinganactivex I triede with fpc 2.4.4 but nothing changes. Would you mind having a look a the full dll with your more recent fpc? By the way, how do I install fpc 2.5.x ?? I might send it to you privately; the only trouble is that you don't have a real hardware to connect it, even if the transducers class are created during the main device creation and their count and status are (should) always be available even if not connected. A test case would simply: 1) createoleobject //OK 2) object.transducers.count // OK, always 8 3) object.transducers(1).Status // ???? should be an integer, not a crash !!! R# 2011/5/31 Roberto Padovani : > Thanks, I'll try installing a more recent fpc and lazarus... > > > > 2011/5/30 Ludo Brands : >> I created a small automation object with following IDL (part of it): >> >>   interface ItestAX: IDispatch >>  { >>    [ >>    propget, >>    id(0x00000001) >>    ] >>    HRESULT _stdcall Devices([out, retval] IDevices ** Value ); >>  }; >> >>   interface IIDevices: IDispatch >>  { >>    [ >>    propget, >>    id(0x00000000) >>    ] >>    HRESULT _stdcall Device([in] long Idx, [out, retval] IDevice ** >> Value ); >>    [ >>    propget, >>    id(0x00000002) >>    ] >>    HRESULT _stdcall Count([out, retval] long * Value ); >>  }; >> >>   interface IIDevice: IDispatch >>  { >>    [ >>    propget, >>    id(0x00000001) >>    ] >>    HRESULT _stdcall Name([out, retval] BSTR * Value ); >>  }; >> >> This matches pretty much the interface you described earlier. Note >> the >> id(0x00000000) which makes Device the default member of IIDevices. This is >> the same as id(DISPID_VALUE) in your case. >> >> Now, the following lines do work for me to get the Name member of >> IIDevice >> (ActX,a,b:variant;s:string): >> >>  ActX:=CreateOleObject(MyTestControl); >>  a:=ActX.Devices; >>  b:=a.Device[3]; >>  s:=b.Name; >>  b:=ActX.Devices.Device[3]; >>  s:=b.Name; >>  b:=ActX.Devices[3]; >>  s:=b.Name; >> >> Note that the default member does work correctly: >> Devices.Device[3]===Devices[3]. >> >> I'm using fpc 2.5.1 svn 17599. >> >> Ludo >> >> _______________________________________________ >> fpc-pascal maillist  -   >> http://lists.freepascal.org/mailman/listinfo/fpc-pascal >> > _______________________________________________ fpc-pascal maillist - http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Roberto Padovani
to Ludo Brands

Finally, I've been able to use the activex collection without any EOleSysException.
I was able to use the collections from Word and Excel, but not from the dll I had.

FPC 2.5.1 from svn r17599 fixed it.

Thanks everyone,

Roberto

2011/5/31 Ludo Brands :

Show quoted text 117 lines
You can send me the file directly. Address is in the message. To install fpc from svn: http://wiki.lazarus.freepascal.org/Getting_Lazarus has good instructions. Ludo > -----Message d'origine----- > De : > De la part > de Roberto Padovani > Envoyé : mardi 31 mai 2011 17:41 > À : FPC-Pascal users discussions > Objet : Re: RE : RE : RE : RE : RE : RE : RE : RE : > [fpc-pascal] support forusinganactivex > > > I triede with fpc 2.4.4 but nothing changes. Would you mind > having a look a the full dll with your more recent fpc? By > the way, how do I install fpc 2.5.x ?? I might send it to you > privately; the only trouble is that you don't have a real > hardware to connect it, even if the transducers class are > created during the main device creation and their count and status are > (should) always be available even if not connected. > > A test case would simply: > 1) createoleobject  //OK > 2) object.transducers.count // OK, always 8 > 3) object.transducers(1).Status   //   ???? should be an integer, not > a crash !!! > > R# > > > 2011/5/31 Roberto Padovani : > > Thanks, I'll try installing a more recent fpc and lazarus... > > > > > > > > 2011/5/30 Ludo Brands : > >> I created a small automation object with following IDL > (part of it): > >> > >>   interface ItestAX: IDispatch > >>  { > >>    [ > >>    propget, > >>    id(0x00000001) > >>    ] > >>    HRESULT _stdcall Devices([out, retval] IDevices ** Value ); > >>  }; > >> > >>   interface IIDevices: IDispatch > >>  { > >>    [ > >>    propget, > >>    id(0x00000000) > >>    ] > >>    HRESULT _stdcall Device([in] long Idx, [out, retval] IDevice ** > >> Value ); > >>    [ > >>    propget, > >>    id(0x00000002) > >>    ] > >>    HRESULT _stdcall Count([out, retval] long * Value ); > >>  }; > >> > >>   interface IIDevice: IDispatch > >>  { > >>    [ > >>    propget, > >>    id(0x00000001) > >>    ] > >>    HRESULT _stdcall Name([out, retval] BSTR * Value ); > >>  }; > >> > >> This matches pretty much the interface you described earlier. Note > >> the > >> id(0x00000000) which makes Device the default member of > IIDevices. This is > >> the same as id(DISPID_VALUE) in your case. > >> > >> Now, the following lines do work for me to get the Name member of > >> IIDevice > >> (ActX,a,b:variant;s:string): > >> > >>  ActX:=CreateOleObject(MyTestControl); > >>  a:=ActX.Devices; > >>  b:=a.Device[3]; > >>  s:=b.Name; > >>  b:=ActX.Devices.Device[3]; > >>  s:=b.Name; > >>  b:=ActX.Devices[3]; > >>  s:=b.Name; > >> > >> Note that the default member does work correctly: > >> Devices.Device[3]===Devices[3]. > >> > >> I'm using fpc 2.5.1 svn 17599. > >> > >> Ludo > >> > >> _______________________________________________ > >> fpc-pascal maillist  -   > >> http://lists.freepascal.org/mailman/listinfo/fpc-pascal > >> > > > _______________________________________________ > fpc-pascal maillist  -   > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > _______________________________________________ fpc-pascal maillist  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal