Programm, welches zur Laufzeit bestimmte Services anbietet?



  • Hallo,

    ich möchte ein Programm implementieren, welches zur Laufzeit bestimmte Services anbietet, die von einem oder mehreren Client-Programmen auf dem selben Rechner benutzt werden können.
    Mit einem COM-Server lässt sich das ja scheinbar wunderbar lösen, allerdings bekommt dabei jedes Clientprogramm jedes Mal eine neue Instanz des Servers.
    Ich möchte den Server jedoch a) manuell starten (.exe) und beenden können und es soll b) auch nur genau eine Instanz im Speicher geben, sodass Änderungen, die Client 1 z.B. an einer Membervariable des Servers vornimmt, von Client 2 gesehen werden können.

    Wie mach ich das am besten??

    MfG, Thomas



  • Kuck dir das mit DCOM nochmal genauer an.
    Inside Distributed COM | ISBN: 3860634593

    b) ist auf jeden Fall lösbar
    a) wenn der Server gebraucht wird, wird er halt durch den Client gestartet,
    wo liegt dein Problem ?



  • Out-Proc COM-Server gibt es nur einen für jeden Benutzer.
    Wenn Du nur *einen* im System haben willst, kannst Du den COM-Server als Service laufen lassen.



  • Hallo

    Redhead schrieb:

    a) wenn der Server gebraucht wird, wird er halt durch den Client gestartet,
    wo liegt dein Problem ?

    Das Problem ist, dass der Client am Ende per Release() den Server beendet. Kommt der nächste Client, wird ein neuer Serverprozess gestartet, aber die alten Daten sind weg.

    Jochen Kalmbach schrieb:

    Wenn Du nur *einen* im System haben willst, kannst Du den COM-Server als Service laufen lassen.

    Was bedeutet das genau, "als Service laufen lassen"?

    Gruß, Thomas



  • Thomas++ schrieb:

    Das Problem ist, dass der Client am Ende per Release() den Server beendet. Kommt der nächste Client, wird ein neuer Serverprozess gestartet, aber die alten Daten sind weg.

    Du brauchst doch den Server nicht beenden. Lass ihn doch einfach weiterlaufen...

    Jochen Kalmbach schrieb:

    Wenn Du nur *einen* im System haben willst, kannst Du den COM-Server als Service laufen lassen.

    Was bedeutet das genau, "als Service laufen lassen"?[/quote]AFAIK kannst Du beim Wizard angeben, was für eine Art von Server Du haben willst. Und da kann man auch Service auswählen. Der läuft dann unter einem bestimmten Benutzer-Account und läuft auch, wenn niemand angemeldet ist.



  • Jochen Kalmbach schrieb:

    Thomas++ schrieb:

    Das Problem ist, dass der Client am Ende per Release() den Server beendet. Kommt der nächste Client, wird ein neuer Serverprozess gestartet, aber die alten Daten sind weg.

    Du brauchst doch den Server nicht beenden. Lass ihn doch einfach weiterlaufen...

    Dann bekommt der nächste Client per CoCreateInstance() aber trotzdem eine neue Instanz des Servers. Und die alte Instanz wartet vergeblich auf Beendigung.



  • Ich hoff ja mal das die Daten um die es dir geht nicht nur im Hauptspeicher
    liegen sondern "ordentlich" gespeichert werden, z.B. in einer Datenbank.
    In diesem Fall sollte sich dein Problem wohl von selbst erledigen.



  • Thomas++ schrieb:

    Dann bekommt der nächste Client per CoCreateInstance() aber trotzdem eine neue Instanz des Servers. Und die alte Instanz wartet vergeblich auf Beendigung.

    Nein, warum? Du darfst halt nie "Revoke" aufrufen!
    Bei ATL musst Du AFAIK eine bestimmte Methode derm MainApp überladen, dann wird das beendet verhindert.



  • Jochen Kalmbach schrieb:

    Thomas++ schrieb:

    Dann bekommt der nächste Client per CoCreateInstance() aber trotzdem eine neue Instanz des Servers. Und die alte Instanz wartet vergeblich auf Beendigung.

    Nein, warum? Du darfst halt nie "Revoke" aufrufen!
    Bei ATL musst Du AFAIK eine bestimmte Methode derm MainApp überladen, dann wird das beendet verhindert.

    Ok, ich wühl mich gerade durch diverse Beispiele.

    Klar scheint mir inzwischen: Wenn, dann geht es nur mit einem lokalen Exe-Server , mit einer Inproc-DLL gehts wohl nicht.
    Hier gibts Beispiele von Microsoft, leider mit sehr spärlicher Dokumentation: http://support.microsoft.com/?scid=kb%3Ben-us%3B291389&x=12&y=11

    Übrigens hat der per ATL-Wizard erstellte Server diese einfache "Lebensroutine":

    hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE);
    _ASSERTE(SUCCEEDED(hRes));
    
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    	DispatchMessage(&msg);
    
    _Module.RevokeClassObjects();
    

    Wahrscheinlich muss ich da was Grundlegendes ändern, dennn hier wird ja tatsächlich das Revoke aufgerufen, sobald die WM_QUIT-Message eines Clients eintrifft.

    Gruß, Thomas.



  • Du darfst das WM_QUIT natürlich gar nicht erst zulassen... Das kannst Du irgendwo im Release Deines COM-Objektes ändern (muesste jetzt aber auch erst mal nachschauen...)


Anmelden zum Antworten