AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Eigene Anwendung per COM fernsteuern - Wie vorgehen?
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Anwendung per COM fernsteuern - Wie vorgehen?

Ein Thema von Ares · begonnen am 28. Sep 2011 · letzter Beitrag vom 29. Sep 2011
Antwort Antwort
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#1

Eigene Anwendung per COM fernsteuern - Wie vorgehen?

  Alt 28. Sep 2011, 16:00
Hallo!

Mein Ziel ist es eine eigene Anwendung von einem anderen, eigenen Programm aus fernsteuern zu können. Konkret geht es um ein FTP Programm, dass von einem anderen Programm die Nachricht erhalten soll eine Datei von Pfad X auf Server Y zu laden.

Hierfür habe ich mich mit COM beschäftigt und schon eine ganze Zeit mit Testprojekten experimentiert. Mit den Begriffen von COM wäre das FTP Programm der Automatisierungs-Server der seine Funktionen über COM zugänglich macht. Das andere Programm wäre der zugehörige Client der auf diese Funktionen zugreift.

Ich habe es soweit geschafft einen Server und einen Client zu erstellen. Der Server ist ein Anwendung (also keine DLL, Ouf-Of-Process und nicht In-Process) mit einem Form und einem Memo darauf. Das Server-Objekt stellt die Methode Post zur Verfügung, die einen empfangenen Text ins Memo schreibt. Das Ganze klappt ganz gut: Starte ich den Client wird eine Instanz des COM-Objectes erstellt und eine Post-Nachricht gesendet. Das Server-Programm erscheint und die Meldung wird korrekt in das Memo geschrieben.

Soweit so gut. Starte ich allerdings mehrere Instanzen des Clients starten diese auch jeweils eine eigene Instanz des Servers. Das Server-Fenster erscheint also mehrfach und jeder Client posted in seinem eigenen Server.

Mein Ziel wäre aber folgendes:
Der Server kann nur einmal gestartet werden. Greift der Client auf den Server zu wird zunächst geprüft ob dieser läuft und ggf. gestartet. Laufen mehrere Clients werden deren Nachrichten alle im gleichen Server geposted.

Leider ist es mich noch nicht gelungen dies mit COM umzusetzen. Ist dies überhaupt möglich? Wie müsste ich in diesem Fall vorgehen?

Geeignete Tutorials in dieser Richtung habe ich leider nicht gefunden. Diese beziehen sich immer nur auf die Automtatisierung anderer Programme wie z.B. Word oder Excel.

Ich bin für jeden Tipp Dankbar!
Ares
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: Eigene Anwendung per COM fernsteuern - Wie vorgehen?

  Alt 28. Sep 2011, 16:07
Stichwort Excel. Da wird soweit ich weiß mit GetObject eine vorhandene Instanz des Servers geholt und mit CreateObjeckt eine Instanz erstellt. Beides oft gekoppelt. Schlägt GetObject fehl, dann halt CreateObject. Das müsste doch in Delphi ähnlich sein.
Ralph
  Mit Zitat antworten Zitat
Dawn87

Registriert seit: 15. Feb 2007
Ort: Lüdenscheid
189 Beiträge
 
Delphi XE5 Professional
 
#3

AW: Eigene Anwendung per COM fernsteuern - Wie vorgehen?

  Alt 28. Sep 2011, 16:09
Bin zwar kein COM-Guru aber wie erzeugst Du die COM-Objekte? Mit CreateOleObject? Es gibt mit der Funktion GetActiveOleObject eine Funktion die Dir eine Referenz auf ein schon vorhandene COM-Objekt liefert.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Eigene Anwendung per COM fernsteuern - Wie vorgehen?

  Alt 28. Sep 2011, 16:15
Schau mal in deine xxxx_Impl-Quelldatei.

Dort steht eine Eintrag der Art:

      TAutoObjectFactory.Create(ComServer, <MeineComKlasse>, <MeineCom-Class-ID>, ciSingleInstance, tmApartment); Die beiden letzten Parameter (hier ciSingleInstance und tmApartment) steuern das Verhalten.

Hier müsstest du mit dne alternativen Werten (ciMultiInstance bzw tmSingle, tmFree, tmBoth, tmNeutral) herumspielen um das gewünschte Verhalten zu bekommen.

Willst du Tiefer in COM einsteigen und dies in deutscher Sprache tun, so besorg dir am besten das Buch von A. Kosch.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.005 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Eigene Anwendung per COM fernsteuern - Wie vorgehen?

  Alt 28. Sep 2011, 16:34
Ich bin für jeden Tipp Dankbar!
Ausser COM gibt es auch einfachere Methoden der Prozesskommunikation, von einfachen Windows Nachrichten und Named Pipes bis hin zu Sockets. Mit Indy oder Synapse und wenigen Zeilen Code kann man zum Beispiel einen HTTP Server in der Serveranwendung integrieren, der auf Befehle eines Clients wartet.
Michael Justin
  Mit Zitat antworten Zitat
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#6

AW: Eigene Anwendung per COM fernsteuern - Wie vorgehen?

  Alt 28. Sep 2011, 19:35
Ich weiß zwar nicht genau was ich nun anders gemacht habe, aber jetzt funktioniert es

Wie vorher habe ich für den Server ein Automatisierungsobjekt erstellt. Hierbei ist wichtig, dass die Instantiierungs-Methode auf "Mehrere Instanzen" eingestellt wird.


Nun habe ich aber ein neues Problem:
Läuft der Server noch nicht wenn der Client diesen aufruft wird er automatisch gestartet. Soweit so gut. Allerdings wird der Server auch wieder automatisch beendet wenn der Client beendet wird bzw. dieser seine Referenz auf den Server löscht. Das ist nicht gewollt, wenn der Server durch die Nachricht vom Client mit der Abarbeitung einer Aufgabe beginnt (z.B. FTP Upload). In diesem Fall soll der Server natürlich weiterlaufen.

Wie kann ich diese lösen?

Das das COM-Objekt gelöscht wird sobald der Referenzzähler Null erreicht ist logisch, aber warum wird direkt das ganze Programm mit beendet?

Lief der Server schon vor dem Aufruf durch den Client tritt das Problem nicht auf: Der Server läuft auch nach dem Beenden des Clients weiter. Dies verstehe ich dann auch nicht, denn der Server selbst erstellt keine Referenz auf das COM-Objekt. Dieses erreicht also genau wie im ersten Fall einen Renferenzcount von Null sobald der Client beendet wird. Warum wird der Server einmal beendet und einmal nicht?

Kann der Server das Signal zum Beenden im ersten Fall (Server durch Client gestartet) irgendwie abfangen und prüfen ob er noch zu arbeiten hat oder nicht?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Eigene Anwendung per COM fernsteuern - Wie vorgehen?

  Alt 28. Sep 2011, 19:42
Wie vorher habe ich für den Server ein Automatisierungsobjekt erstellt. Hierbei ist wichtig, dass die Instantiierungs-Methode auf "Mehrere Instanzen" eingestellt wird.
Ist doch klar: "Mehrere Instanzen" heißt das auf eine laufende Serverinstanz mehrer Clients sich verbinden können. Entspricht ciMultiInstance

Nun habe ich aber ein neues Problem:
Läuft der Server noch nicht wenn der Client diesen aufruft wird er automatisch gestartet. Soweit so gut. Allerdings wird der Server auch wieder automatisch beendet wenn der Client beendet wird bzw. dieser seine Referenz auf den Server löscht. Das ist nicht gewollt, wenn der Server durch die Nachricht vom Client mit der Abarbeitung einer Aufgabe beginnt (z.B. FTP Upload). In diesem Fall soll der Server natürlich weiterlaufen.

Wie kann ich diese lösen?
Stichwort währen hier COM+ bzw. COM in einem NT-Dienst. Ist jedoch nicht so einfach mit Bordmitteln und man verwendet am besten das hier: http://www.aldyn-software.com/svcom.html

Das das COM-Objekt gelöscht wird sobald der Referenzzähler Null erreicht ist logisch, aber warum wird direkt das ganze Programm mit beendet?
As Designed. Es lief ja davor auch nicht. Wenn jemand Excel fernsteuert willst du ja auch nicht das Excel stehen bleibt.

Lief der Server schon vor dem Aufruf durch den Client tritt das Problem nicht auf: Der Server läuft auch nach dem Beenden des Clients weiter. Dies verstehe ich dann auch nicht, denn der Server selbst erstellt keine Referenz auf das COM-Objekt. Dieses erreicht also genau wie im ersten Fall einen Renferenzcount von Null sobald der Client beendet wird. Warum wird der Server einmal beendet und einmal nicht?
Eigenheit von Delphi (und fürs Debuggen ganz schön) das man sich mit einer laufenden Exe einmal verbinden kann. Diese sozusagend eine Einmal-COM-Interface anbietet.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#8

AW: Eigene Anwendung per COM fernsteuern - Wie vorgehen?

  Alt 29. Sep 2011, 07:44
Ist doch klar: "Mehrere Instanzen" heißt das auf eine laufende Serverinstanz mehrer Clients sich verbinden können. Entspricht ciMultiInstance
So klar finde ich das gar nicht. Ich habe dies zuerst so gelesen, dass damit "mehrere Instanzen vom Server" gestartet werden können. Wenn man weiß, dass sich die Instanzen auf die Clients und nicht auf den Server beziehen wird es klarer
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Eigene Anwendung per COM fernsteuern - Wie vorgehen?

  Alt 29. Sep 2011, 07:49
So klar finde ich das gar nicht. Ich habe dies zuerst so gelesen, dass damit "mehrere Instanzen vom Server" gestartet werden können. Wenn man weiß, dass sich die Instanzen auf die Clients und nicht auf den Server beziehen wird es klarer
Ich gebs ja zu: Ich hatte als ich mit COM/Automation angefangen habe das gleiche wie du am anfang damit assoziiert
Aber nach ein paar Tests habe ich halbwegs verstanden was die Aufzählungen hier bedeuten.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz