Interfaces COM, CORBA oder gar nicht ?
Interfaces COM, CORBA oder gar nicht ?
Hallo,
ich plane ein grösseres Projekt zu erweitern und ein wenig zukunftssicherer zu machen.
Es handelt sich um mehrere libraries, in denen Geräte angesprochen werden und die irgendwelche Daten liefern.
Das ganze ist multithreaded, aber vermutlich für die Frage egal.
Ich hätte gerne ein Objekt (ohne LCL-GUI Komponenten) in einer library (so, DLL), also zum Beispiel ein Multimeter.
Dieses würde ich gerne instanzieren und als Klasse benutzen.
Mein Kenntnisstand sagt, Interfaces seien die einzige Möglichkeit eine Klasse in eine library zu packen ?
Ich habe dafür bislang Interfaces (COM) verwendet und soweit begriffen. Dennoch um eine Sackgasse zu
vermeiden die konkreten Fragen:
- Überhaupt interfaces ?
Ich habe das Gefühl, Interfaces werden selten verwendet ?
Besser API prozedural exportieren und danach wieder eine Klasse basteln ?
- Wenn ja, COM oder CORBA ?
Ich habe das mit COM bisher hinbekommen aber das refcounting raubt mir den letzten Nerv.
CORBA aber scheinen noch weniger Programmierer zu verwenden als COM ?
Ich finde Interfaces ohne Refcounting jedoch mit Properties sehr sympathisch aber
wird das in einigen Jahren auch noch unterstützt oder ist das eine Sackgasse ?
Wie gesagt es sind einige libraries, die alle zusammenarbeiten sollen und ich habe bislang keine andere Idee
als Interfaces um Klassen in libraries zu packen.
Vielen Dank schon mal, viele Grüße,
Stefan
ich plane ein grösseres Projekt zu erweitern und ein wenig zukunftssicherer zu machen.
Es handelt sich um mehrere libraries, in denen Geräte angesprochen werden und die irgendwelche Daten liefern.
Das ganze ist multithreaded, aber vermutlich für die Frage egal.
Ich hätte gerne ein Objekt (ohne LCL-GUI Komponenten) in einer library (so, DLL), also zum Beispiel ein Multimeter.
Dieses würde ich gerne instanzieren und als Klasse benutzen.
Mein Kenntnisstand sagt, Interfaces seien die einzige Möglichkeit eine Klasse in eine library zu packen ?
Ich habe dafür bislang Interfaces (COM) verwendet und soweit begriffen. Dennoch um eine Sackgasse zu
vermeiden die konkreten Fragen:
- Überhaupt interfaces ?
Ich habe das Gefühl, Interfaces werden selten verwendet ?
Besser API prozedural exportieren und danach wieder eine Klasse basteln ?
- Wenn ja, COM oder CORBA ?
Ich habe das mit COM bisher hinbekommen aber das refcounting raubt mir den letzten Nerv.
CORBA aber scheinen noch weniger Programmierer zu verwenden als COM ?
Ich finde Interfaces ohne Refcounting jedoch mit Properties sehr sympathisch aber
wird das in einigen Jahren auch noch unterstützt oder ist das eine Sackgasse ?
Wie gesagt es sind einige libraries, die alle zusammenarbeiten sollen und ich habe bislang keine andere Idee
als Interfaces um Klassen in libraries zu packen.
Vielen Dank schon mal, viele Grüße,
Stefan
- af0815
- Lazarusforum e. V.
- Beiträge: 6764
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Interfaces COM, CORBA oder gar nicht ?
Noch eine Frage dazu - welche Plattformen soll das Projekt unterstützen ? Aus der Beschreibung erkenne ich nur Windows, ist das richtig ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Interfaces COM, CORBA oder gar nicht ?
Hallo,
gute Frage.
Persönlich bin ich linux only unterwegs, mein Lehrer - sagen wir Mentor - jedoch windows only.
Ich schätze sehr die Plattformunabhängigkeit von Lazarus wo selbst grössere Projekte mit
keinen bis wenig $ifdefs sofort laufen.
Mir würde linux only ausreichen. Es wäre aber schön, wenn es auf windows laufen würde und es
wäre schön, wenn die Chance besteht, dass daran interessierte das ganze nutzen und ggf. erweitern können.
Grüße, Stefan
edit:
zur Präzisierung:
ich muß keine Windows libraries nutzen. Audio sampling mach ich nativ oder portaudio, geht beides.
Also ich bin nicht auf COM oder windows Spezifika angewiesen.
Es geht nur um die sinnvollste Planung des Projektes (wessen Vorfahre mit Iinterfaces ala COM realisiert ist).
gute Frage.
Persönlich bin ich linux only unterwegs, mein Lehrer - sagen wir Mentor - jedoch windows only.
Ich schätze sehr die Plattformunabhängigkeit von Lazarus wo selbst grössere Projekte mit
keinen bis wenig $ifdefs sofort laufen.
Mir würde linux only ausreichen. Es wäre aber schön, wenn es auf windows laufen würde und es
wäre schön, wenn die Chance besteht, dass daran interessierte das ganze nutzen und ggf. erweitern können.
Grüße, Stefan
edit:
zur Präzisierung:
ich muß keine Windows libraries nutzen. Audio sampling mach ich nativ oder portaudio, geht beides.
Also ich bin nicht auf COM oder windows Spezifika angewiesen.
Es geht nur um die sinnvollste Planung des Projektes (wessen Vorfahre mit Iinterfaces ala COM realisiert ist).
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Interfaces COM, CORBA oder gar nicht ?
MSEgui nutzt CORBA-Interfaces extensiv, die Methode hat sich bewährt und ist sicher keine Sackgasse.magnetron hat geschrieben: - Wenn ja, COM oder CORBA ?
Ich habe das mit COM bisher hinbekommen aber das refcounting raubt mir den letzten Nerv.
CORBA aber scheinen noch weniger Programmierer zu verwenden als COM ?
Ich finde Interfaces ohne Refcounting jedoch mit Properties sehr sympathisch aber
wird das in einigen Jahren auch noch unterstützt oder ist das eine Sackgasse ?
Da MSEgui früher Delphi kompatibel war und Delphi lediglich referenz-gezählte COM-Interface hatte, kann ich deine Erlebnisse mit COM gut nachvollziehen, die haben mir auch den letzten Nerv geraubt.

Bei Free Pascal kommt hinzu, dass der Zeitpunkt wann die Referenz 0 erreicht und das Objekt abgeräumt wird als "Implementations-Detail" betrachtet wird und man sich nicht darauf verlassen kann. Bei Delphi ist das etwas besser.
Das mit Klassen in DLL/SO's gepackt würde ich mir nochmals überlegen. Free Pascal kennt keine "Packages" wie Delphi. Jede einzelne DLL hat ihre eigene Speicher-Verwaltung und eigene Kopie der Basisklassen. Schon nur die modulübergreifende Verwendung von Strings ist nicht einfach.
Was versprichst du dir von der Verwendung von DLL/SO's anstatt von units?
Falls du noch nie von MSEide+MSEgui gehört hast, das Projekt mit den vielen CORBA-Interfaces ist hier:
http://sourceforge.net/projects/mseide-msegui/
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Interfaces COM, CORBA oder gar nicht ?
Wieso ? Eigentlich sind (meiner Meinung nach) solche Interfaces bezüglich Libraries nur ein praktisches add-on, weil ein standardisiertes Format existiert durch das beim Design der aufrufenden Application die IDE automatisch ein Interface "importieren" und eine Unit mit Zugriffs-Funktionen/Klassen konstruieren kann.magnetron hat geschrieben:Mein Kenntnisstand sagt, Interfaces seien die einzige Möglichkeit eine Klasse in eine library zu packen ?
Man kann mit fpc keine C++ Klassen aufrufen und umgekehrt (egal ob per dynamischem (DLL/so) oder durch statisches Linken).
Wenn beides mit fpc generiert ist, kann auch in einer dll/so eine Klasse verwendet werden.
Ein Problem gibt es allerdings bei der Heap-Verwaltung. Soweit ich weiß, hat eine dll/so bei fpc eine eigene Heap-Verwaltung. Man darf deshalb nichts z.b. im Executable allokieren und in der Library freigeben, weil die entsprechenden Funktionen unterschiedliche Heap-Verwaltungen aufrufen. Das Problem tritt am deutlichsten bei Strings zutage, die ja "reference-counted" automatisch angelegt und freigegeben werden und deshalb nicht unbedacht an eine Library -Funktion übergeben werden dürfen. Beim "Create" und "Destroy" einer Klasse wird ebenfalls automatisch Heap allokiert und deallokiert. Soweit ich weiß gibt es eine Möglichkeit, die Heapverwaltungen zu vereinheitlichen. (Macht Delphi z.B. bei "Rutime-Libraries". Soweit ich weiß stehen Runtime-Libraries beim FPC-Team auf der ToDo-Liste).
Ein weiteres Problem betrifft GUI-Funktionen. Soweit ich weiß hat - wenn man es einbindet - die dynamische Library ein eigenes "Application" Objekt und somit eine komplett eigene GUI. Da aber kein Thread dafür angelegt wird, "läuft" diese überhaupt nicht und es wird kein Main-Window angelegt. Aber die GUI Objekte in der Library sind auch keine "Kinder" des Main-Windows der gestarteten Application. (Vermutlich ist auch das bei Delphi "Runtime_Libraries" vereinheitlicht.)
-Michael
-
- Beiträge: 203
- Registriert: Di 22. Sep 2009, 13:08
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Interfaces COM, CORBA oder gar nicht ?
Noch eine Frage dazu wäre, ob man den Code in anderen Programmiersprachen verwenden will.
Bleibt man innerhalb von Pascal, kann man die Klassen/Units auch ohne Umweg direkt verwenden.
Meine Libraries stellen meistens per Fassade-Pattern ein Interface bereit, über das man auf die
Funktionen der Library zugreifen kann. Referenzzählung ist dabei immer nur ein unnötiges Hindernis.
Dieselben Klassen in verschiedenen Programmiersprachen verwenden zu wollen ist problematisch.
COM/ActiveX wurde genau dafür gemacht, ist aber in der Praxis ein ziemlicher Murks (und Windows-spezifisch).
Wenn eine sprachübergreifende API etwas taugt, ist sie normalerweise rein prozedural und C-kompatibel.
Um dann wieder komfortabel mit Klassen arbeiten zu können, benötigt man für jeder Sprache noch einen Wrapper,
der die ganzen prozeduralen Objekt-Handles wieder in Objekte übersetzt.
procedure Test(Handle: TMyHandle; a, b, c: Integer)
->
procedure TMyObject.Test(a, b, c: Integer);
Bleibt man innerhalb von Pascal, kann man die Klassen/Units auch ohne Umweg direkt verwenden.
Meine Libraries stellen meistens per Fassade-Pattern ein Interface bereit, über das man auf die
Funktionen der Library zugreifen kann. Referenzzählung ist dabei immer nur ein unnötiges Hindernis.
Dieselben Klassen in verschiedenen Programmiersprachen verwenden zu wollen ist problematisch.
COM/ActiveX wurde genau dafür gemacht, ist aber in der Praxis ein ziemlicher Murks (und Windows-spezifisch).
Wenn eine sprachübergreifende API etwas taugt, ist sie normalerweise rein prozedural und C-kompatibel.
Um dann wieder komfortabel mit Klassen arbeiten zu können, benötigt man für jeder Sprache noch einen Wrapper,
der die ganzen prozeduralen Objekt-Handles wieder in Objekte übersetzt.
procedure Test(Handle: TMyHandle; a, b, c: Integer)
->
procedure TMyObject.Test(a, b, c: Integer);
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Interfaces COM, CORBA oder gar nicht ?
Willst Du dann in ANSI-C die Objekt-Struktur von fpc aufdröseln ?Patito hat geschrieben:procedure Test(Handle: TMyHandle; a, b, c: Integer)
->
procedure TMyObject.Test(a, b, c: Integer);
-Michael
-
- Beiträge: 203
- Registriert: Di 22. Sep 2009, 13:08
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Interfaces COM, CORBA oder gar nicht ?
???mschnell hat geschrieben:Willst Du dann in ANSI-C die Objekt-Struktur von fpc aufdröseln ?Patito hat geschrieben: ... Übersetzung C-API -> Object-Pascal
Nein. Object-Pascal -> C-API ist die entgegengesetzte Richtung....
Re: Interfaces COM, CORBA oder gar nicht ?
Vielen Dank für die hilfreichen und fundierten Kommentare.
Meine Grundidee war, dass ich nur kleinere Teile programmieren muss und diese
dass in Form einer DLL wiederverwenden kann.
Eure Kommentare haben mir weitergeholfen und ich denke noch etwas drüber nach.
Bei längerem Nachdenken über Deine wirklich gute Frage müsste das aber mit units genauso zu erreichen sein ohne den Verwaltungsoverhead für die dlls und evtl. ohne andere Nachteile.
fragt der Aufrufer wieviel er allozieren muss und holt dann die Daten ab (als Kopie).
Funktioniert aber macht wieder overhead.
Wenn ich (nur) units nehme, wird gerade der Datentransfer innerhalb des Programmes einfacher und überschaubarer vermute ich.
Mit units könnte ich dann (doch wieder) dynamische arrays und sonstige Datentypen nach belieben verwenden.
Im Moment komme ich also zum Schluss, dass ich die Einzelteile sauber in units unterbringe
(die auch separat prüfbar/pflegbar sind) und aus diesen (dann vielen) units ein Programm baue für eben seinen Zweck.
Nochmal danke für die konstruktive Hilfe, tolles Forum,
Grüße, Stefan
Meine Grundidee war, dass ich nur kleinere Teile programmieren muss und diese
dass in Form einer DLL wiederverwenden kann.
Eure Kommentare haben mir weitergeholfen und ich denke noch etwas drüber nach.
Das freut mich und klingt sympathisch. Ob ich Interfaces brauche wage ich nun aber zu bezweifeln.MSEgui nutzt CORBA-Interfaces extensiv, die Methode hat sich bewährt und ist sicher keine Sackgasse.
Ich dachte mein Programm wird vielleicht in einfachere Teile aufgeteilt und ist besser les- und pflegbar.Was versprichst du dir von der Verwendung von DLL/SO's anstatt von units?
Bei längerem Nachdenken über Deine wirklich gute Frage müsste das aber mit units genauso zu erreichen sein ohne den Verwaltungsoverhead für die dlls und evtl. ohne andere Nachteile.
Stimmt vermutlich, daher habe ich auf GUI in dll verzichtet. Bezüglich DatenübergabeWenn beides mit fpc generiert ist, kann auch in einer dll/so eine Klasse verwendet werden.
Ein Problem gibt es allerdings bei der Heap-Verwaltung....
... Ein weiteres Problem betrifft GUI-Funktionen..
fragt der Aufrufer wieviel er allozieren muss und holt dann die Daten ab (als Kopie).
Funktioniert aber macht wieder overhead.
Wenn ich (nur) units nehme, wird gerade der Datentransfer innerhalb des Programmes einfacher und überschaubarer vermute ich.
Ich bleibe in fpc. Externe API erstmal nicht nötig.Bleibt man innerhalb von Pascal, kann man die Klassen/Units auch ohne Umweg direkt verwenden.
Meine Libraries stellen meistens per Fassade-Pattern ein Interface bereit, ...
...Wenn eine sprachübergreifende API etwas taugt, ist sie normalerweise rein prozedural und C-kompatibel.
Mit units könnte ich dann (doch wieder) dynamische arrays und sonstige Datentypen nach belieben verwenden.
Im Moment komme ich also zum Schluss, dass ich die Einzelteile sauber in units unterbringe
(die auch separat prüfbar/pflegbar sind) und aus diesen (dann vielen) units ein Programm baue für eben seinen Zweck.
Nochmal danke für die konstruktive Hilfe, tolles Forum,
Grüße, Stefan
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Interfaces COM, CORBA oder gar nicht ?
Die Richtung ist egal. "Dröseln" geht nur in ANSI C, egal ob Du die Information von fpc bekommst und analysiert oder so vorbereitesn willst, dass fpc sie versteht..Patito hat geschrieben:???
Nein. Object-Pascal -> C-API ist die entgegengesetzte Richtung....
Jedenfalls nicht ganz trivial.
-Michael
Zuletzt geändert von mschnell am Do 28. Mai 2015, 15:08, insgesamt 1-mal geändert.
-
- Beiträge: 1102
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: Interfaces COM, CORBA oder gar nicht ?
Und wenn mehrere Kompilers oder -versionen im Spiel kommen wird es noch schlimmer.mse hat geschrieben: Das mit Klassen in DLL/SO's gepackt würde ich mir nochmals überlegen. Free Pascal kennt keine "Packages" wie Delphi. Jede einzelne DLL hat ihre eigene Speicher-Verwaltung und eigene Kopie der Basisklassen. Schon nur die modulübergreifende Verwendung von Strings ist nicht einfach.
Man wird dann einfach weg zurück geworfen auf ganz separierter manuelle Speicher Allokation (1) und reine Prozedurale . (2)
(1) das heißt das der Programmteil (exe,dll) der etwas allokiert es auch muss freigeben.
(2) wird auch oft falsch ein C Api genannt. Ist strikt genommen aber der niedrigsten gemeinsame Teiler der prozedurale Fähigkeiten der betroffen Sprachen. Wenn ein davon ein C ist, werden gewisse Dingen angenommen, ist aber sehr unexakt.
Das einzige das besser ist (also auf Object Ebene, und automatische (wide-)strings) ist COM. Also auf Windows. Das Funktioniert, aber dann muss man auch wirklich fuer gehen, also die Regeln folgen, und nicht mit ein Paar der COM Techniken (wie COM interfaces) selbst etwas basteln.
Es gibt einige versuche auf Linux (wie XPCOM für Mozilla) sind aber nicht universell und oft nicht robust Versionsweise. (also nur heutiger KDE/Mozilla usw Version)
Interfaces (Corba oder nicht) lösen das Hauptproblem, Speicherverwaltung nicht.