Anwendung von DCOM



  • Hallo zusammen,

    ich arbeite an einem kleinem C++ Projekt, bei dem es quasi um die Fernsteuerung eines Programms geht (nicht im Sinne von Remote Desktop). Mein Hauptprogramm zur Messwertaufnahme ("Server") ist in C++ geschrieben (mir liegen nur die Binaries vor) und kann durch eigene MFC-dll Dateien um weitere Funktionalitäten erweitert werden (hier DCOM-Server). Nun möchte ich gerne eine auf DCOM basierende Kommunikation zwischen eben diesem Server und einem Clienten erstellen. Der Client soll unter C++ und Matlab realisiert werden.
    Bevor ich jetzt wie wild drauflos programmiere wollte ich mich erst einmal nach Möglichkeiten und Einschränkungen rund um DCOM informieren. Ich bin mir sicher, dass es hier ein paar Leute gibt, die sich damit schon intensiv beschäftigt haben 🙂

    • Ziel Nr1: ich möchte den COM/DCOM Server durch expliziten Aufruf in meinem Messwertprogramm starten (ansonsten könnte der DCOM-Server nicht auf die Funktionen zugreifen). Welche DCOM Variante ist hierfür am besten geeignet( inproc, exe oder Service?)
    • Ziel Nr2: aufruf von Methoden/Funktionen von einem fremden Rechner. Wie richte ich den Server- und Client PC ein, um eine DCOM-Kommunikation zu ermöglichen?

    Bisher habe ich bereits ein COM-Beispielprojekt von Codeproject mit Hilfe des ATL-App-Wizards erfolgreich erstellt und auch eine lokale Kommunikation realisiert, fange also nicht ganz bei null an.
    Würde mich sehr freuen, wenn jemand sich die Mühe macht ein, sich über das Thema mal ein wenig auszulassen.
    Literaturempfehlungen und Links würden mir bestimmt auch weiter helfen, habe leider bisher noch keine guten Tutorials über DCOM gefunden 😞
    Vielen Dank.



  • 1. DCOM ist soweiso nur für den Fall wichtig, wo Du mit externen Rechnern kommunizieren willst.
    2. DCOM ist ein Schei...
    3. Es dauert Stunden bis Du DCOm richtig konfiguriert hast
    4. Es geht nur innerhalb eines Netzwerkes und benötigt diverse Ports auf beiden Seiten
    5. Für ein Beispiel, wie man sowas konfiguriert schau Dir mal die OPC-Konfiguration an:
    http://www.opcfoundation.org/Archive/c9cf0fff-65fa-4362-bc93-aa7d0ab58016/Using OPC via DCOM with XP SP2 v1.10.pdf
    6. Verwende wenn möglich was anderes als DCOM..



  • Erst einmal Danke für deinen Beitrag.
    Mir ist auch schon bei der Recherche aufgefallen, dass es recht aufwendig zu seien scheint mit COM/DCOM. Leider fehlen mir Alternativen, oder besser gesagt, ich kenne kaum welche. COM/DCOM wird ja eigentlich auch von vielen Programmen benutzt, zumindest habe ich das gehört?! Gibt es über Sockets evtl. die Möglichkeit, eine einfache Fernsteuerung meines Messprogramms zu realisieren? Das würde ja z.B. auch die Möglichkeit offen halten, den Clienten unter Linux laufen zu lassen, was bei DCOM nicht der Fall wäre.
    Was benutzt man sonst so für Interprozesskommunikation bzw. Fernsteuerung (es soll auf jeden fall die Kommunikation mit externen Rechnern beiinhalten)



  • COM wird von sehr vielen Programmen genutuzt. DCOM kenne ich keines (das wirklich damit arbeitet)...
    COM wird i.d.R. immer lokal verwendet; da ist es auch sehr gut.

    Für "Fernsteuerung" (ich sag mal RPC) kannst Du z.B. gSOAP verwenden; oder z.B. NamedPipes oder auch MessageSlots.
    ich persönlich würde REST verwendet 😉 am besten noch mit irgend einer Authentifizierung.



  • Ist CORBA nicht der Konkurrent von DCOM? Mit CORBA wird ja auch gerne mal was ferngesteuert.

    SOAP würde ich nicht favorisieren, wenn es um Realtime Steuerung geht, weil der ganze XML- und HTTP-Kram bei WebServices ziemlicher Overhead ist.

    Es gibt freie CORBA-Implementierungen für C++. Das bekannteste dürfte wohl http://www.mico.org/ sein. Wie die Jungs mit Mico mehrere Rechner steuern lassen, sieht man in diesem netten Video: http://www.objectsecurity.com/en-products-simulateworld-video.html

    Ich habe eben noch http://omniorb.sourceforge.net/ entdeckt.



  • Realtime ist unwichtig. Ziel ist lediglich die RemoteSteuerung eines Programms. Funktionen sollen ausgeführt und Parameter hin und her geschickt werden. Das RPC auf Basis von XML finde ich persönlich interessant und es scheint als wäre es beim Vergleich mit DCOM wesentlich anwenderfreundlicher und eine erste Client/Server Kommunikation wäre schnell implementiert. Gibt es noch hilfreiche Literatur zu diesem Thema oder informative Tutorials im Web?
    Was mich noch interessieren würde:
    Gibt es Einschränkungen beim Remote-Aufruf von Funktionen? Also bspw. nur bestimmte Parametertypen(nur int, string), die zulässig sind? Oder kann man auch komplexe Klassen als Parameter an XML "übergeben"?



  • Artchi schrieb:

    Ist CORBA nicht der Konkurrent von DCOM? Mit CORBA wird ja auch gerne mal was ferngesteuert.

    Ich sehe beide nicht als Konkurenten, sondern als Sterbende (und für mich schon lange tod; CORBA ist sogar noch töter als tod).



  • elsucht schrieb:

    Das RPC auf Basis von XML finde ich persönlich interessant und es scheint als wäre es beim Vergleich mit DCOM wesentlich anwenderfreundlicher und eine erste Client/Server Kommunikation wäre schnell implementiert. Gibt es noch hilfreiche Literatur zu diesem Thema oder informative Tutorials im Web?

    Nimm doch gSOAP2
    http://gsoap2.sourceforge.net/

    elsucht schrieb:

    Was mich noch interessieren würde:
    Gibt es Einschränkungen beim Remote-Aufruf von Funktionen? Also bspw. nur bestimmte Parametertypen(nur int, string), die zulässig sind? Oder kann man auch komplexe Klassen als Parameter an XML "übergeben"?

    Man kann auch komplexe Datenstrukturen übergeben.



  • Vielen Dank für deinen Vorschlag. Ich werde mir mal gSOAP genauer anschauen und erstmal versuchen die examples zu verstehen und zu bauen. Zu gSOAP habe ich noch eine Frage: Ist einfache Datenübetragung auch möglich? Also bspw. übertragen eines 10MB Bild von Programm-A nach Programm-B?



  • Prinzipiell schon... hab es noch nicht gemacht, sollte aber gehen. Da musst Du halt direkt den Stream verwenden; hab gedacht, dass es dazu ein Beispiel gibt... hab es aber gerade nicht zur Hand...



  • Habe nun schon erfolgreich einen kleinen Service und einen Client aufgebaut, die auch im Netzwerk wunderbar funktionieren. Bei mir sind beim Programmieren aber noch einige Fragen aufgekommen:

    • Gibt es eine elegante Lösung zum Bauen der header.h mit VS2008 und dem soapcpp-Compiler? Im Moment benutze ich den Custom Build für die header-Datei. Allerdings wird bei jedem Bau des Service oder des Clienten alles neu compiliert (mit soapcpp), das könnte auf Dauer etwas nervig sein. 😃
    • Ich compiliere mit "soapcpp header.h -i ...", also mit "-i" Option. Damit werden ja für C++ ein paar Änderungen vorgenommen im erstellten Source, so dass man sehr viel einfacher Server und Client aufbauen kann. Nun kann ich für den Client ein Proxy-Objekt erstellen, womit ich dann die z.B. RPC-Methoden direkt aufrufen kann. Leider habe ich noch nicht herausgefunden, wie man den "endpoint" also die IP- bzw http-Adresse für den Proxy ändert, falls mein Service mal auf einem anderen PC läuft. Ich kann es ja auch direkt im header.h machen, das ist mir aber zu unflexibel, da ich dann alles nochmal neu bauen muss...
      (gerade gefunden: Proxy Member ".endpoint" direkt ändern durch zuweisen?)
    • und zum Schluss noch eine Frage zu den Streams: Wie ich verstanden habe, serialisiert er mir einfach ein Objekt und man kann es im Anschluss an einen File-, cout-, oder auch Socketstream übergeben. Leider gibt es da kein gutes Beispiel, wo man sich dran orientieren könnte. Wäre es prinzipiell nicht auch möglich, eine einfach Methode zu schreiben, die bspw. ein Bild-Objekt als Eingabeparameter hat? Es würde mir ja für den Beginn schon reichen, ein Bild vom Server/Service zum Client zu übertragen.

Log in to reply