Von der MFC Anwendung zum Windows Dienst



  • Hallo zusammen,

    ich habe vor einiger Zeit mal eine Anwendung geschrieben die als eine Art von Server funktioniert. Im Prinzip ganz einfach, die Anwendung startet einen Thread, der die Netzwerkkommunikation macht und ständig übertragene Daten entgegen nimmt und speichert.
    Nun hat eine solche Anwendung, auch wenn man sie in die Systemleiste packen kann, einen entscheidenden Nachteil. Sie läuft nur wenn jemand angemeldet ist. Um das zu verhindern, muss die Arbeit des Threads in einen Windows Dienst überführt werden. Dabei habe ich einige Probleme.
    Ich habe mit sc.exe versucht die Anwendung als Dienst zu installieren und zu starten. Das ging auch eine Weile gut, nur konnte er die Installation nicht abschließen bzw. hat zwischendurch abgebrochen, was vermutlich mit dem Fehlen der Start() und Stop() Funktion zu erklären ist.
    Mein nächster Ansatz war mit VC++ 2008 eine Windows-Dienst Projektmappe zu erstellen und in der Start() Funktion den Thread zu starten und darin laufen zu lassen. Hier konnte ich plötzlich nicht mehr kompilieren. Er brachte Fehler bei allen gängigen C++ Funktionen und kannte auch die meisten Klassen nicht z.B. CFile.

    Ich bräuchte hier mal etwas Hilfe, wie ich jetzt weiter machen kann. Kurzu zusammengefasst: Die Abarbeitung funktionierte innerhalb der MFC Anwendung bislang gut, ich brauche aber einen Dienst damit.

    Viele Grüße und vielen Dank

    Ranger



  • Hallo

    Eigentlich gibt es 2 Lösungen, die erste wäre das du die MFC Bibliotheken bei deinem neuen Projekt mit dazu linkst (könntest von dem MFC-Projekt einfach übernehmen).

    Oder du tauscht die MFC-Klassen durch die passenden Standard-Klassen aus, zB CFile durch fstream, wobei hier dann dein Code etwas überarbeitet werden müsste.

    Bin der Meinung der 2te Weg wäre der bessere, aber einfach nur deswegen, weil ich der MFC nicht ganz vertraue, das die Klassen nicht doch irgendwie eine GUI brauchen oder einfach nicht für den Dienst-Umfeld gedacht sind.

    Mfg Marco



  • Klar kann man die MFC in einem Service verwenden.
    Theoretisch sogar das ganze Fenster-Gedöns, nur wird die so erstellten Fenster natürlich keiner sehen.

    @Marc-O
    Stell bei den Projekteigenschaften ein dass dein Projekt die MFC verwendet.
    Und: "Er brachte Fehler bei allen gängigen C++ Funktionen" ist keine ausreichende Fehlerbeschreibung.



  • Hallo,

    danke Euch Beiden. Ich werde mal sehen, dass ich das alles eingestellt bekomme.

    Alle gängigen C++ Funktionen

    Das war wirklich blöd ausgedrückt. Ich wollte sagen plötzlich hatte ich 135 Fehler bei vorher funktionsfähigem Code. Also in fast jeder Zeile mit Code war auch ein Fehler. 🙂 Das konnte nicht stimmen.

    Viele Grüße und vielen Dank,

    Ranger



  • Hallo,

    ich habe versucht die MFC statisch oder gemeinsam genutzt zu linken, keine Chance. Die Umgebung meckert, dass es sich nicht mit der Option /crl verträgt. Also sozusagen gehen hier .NET Framework und MFC nicht zusammen. Erscheint mir auch irgendwie logisch. Der von mir verwendete Code enthält MFC KLassen. Somit werde ich sehen müssen alles in .NET zu transferieren.

    Trotzdem danke für Euren Vorschlag. Für weitere Vorschläge wäre ich natürlich dankbar.

    VG
    Ranger



  • Es macht wenig Spass jmd. zu helfen der es nicht schafft einen 3-Buchstaben langen Compilerswitch (/clr) richtig abzutippen, und so wichtige Dinge wie dass er jetzt auf eimal C++/CLI statt C++ verwenden möchte unterschlägt.

    Vorschlag 1: Lern wie man richtig Fragen stellt.
    Vorschlag 2: Mach ein normales Windows Service ohne ".NET Framework" (C++/CLI).
    Vorschlag 3: Änder dein Programm einfach nur soweit ab dass es "headless" laufen kann, und verwende dann eines der tausenden "run .exe as service" Hilfsprogramme.



  • Für den Tippfehler entschuldige ich mich, wenn es darauf ankommt. Aber Du hast ja gewusst worum es geht, denn /crl gibt es nunmal nicht.

    Zu Punkt 2 muss ich sagen, dass ich das nicht unterschlagen habe. Wie am ausgewählten Bereich des Forums zu sehen sein dürfte, bin ich sehr viel, wenn nicht nur im MFC Umfeld unterwegs. Ich weiß, dass es .NET gab, gibt und geben wird, aber leider macht die VS2008 Umgebung bei Auswahl einer Projektmappe für "Windows Dienst" nunmal .NET draus. Das habe ich auch bemerkt, als ich dann den Fehler und den Compilerswitch mal näher angeschaut habe.
    Es ging für mich darum, mein vorhandenes Programm erstmal zu nutzen, zumindest Teile davon, da ist mir auch klar, dass da MFC Kram drinne ist. Wenn die einzige "Windows Dienst Projektmappe" allerdings C++/CLI verwendet und ich das leider (eigene Schuld) erst merke, wenn ich Compilerfehler durch hinzulinken von Bibliotheken beseitigen möchte, macht mich das nicht zu einem dummen Menschen. Dass es keinen Spaß macht, wenn man als Erklärender von falschen Sachen ausgeht und damit auch die Erklärung nichts bringt kann ich mir durchaus vorstellen, aber Fehler passieren und es tut mir leid um Deine Zeit. Nur mal so als Hinweis. Vorschlag 1 ist völlig überflüssig.

    Zu schade eigentlich, denn das habe ich in dem Forum auch schon anders erlebt.

    VG
    Ranger



  • Zu schade eigentlich, denn das habe ich in dem Forum auch schon anders erlebt.

    Nicht immer alles gleich so persönlich nehmen. Ich halte mich in letzter Zeit eh schon sehr zurück mit meiner Kritik - vor allem was den "Ton" angeht, weil ich selbst der Meinung bin dass ich mich da öfters vergriffen habe - und hin und wieder wird mir das natürlich immer noch passieren. Bei manchem Leuten funktioniert das gut, andere aber nehmen anscheinend jede "das hättest du besser machen können" Information sofort persönlich. Bzw. sind einfach davon überzeugt dass sie ausreichend schlau/genau oder gar überhaupt so-gut-wie perfekt wären, und daher jede Kritik einfach nur unangebracht sein kann. Kann natürlich auch sein dass ich es einfach nicht schaffe einen leicht angepissten Unterton zu vermeiden und das das Problem ist. Man weiss es nicht.

    Davon abgesehen hab' ich dir zwei Vorschläge gemacht wie du dein Problem lösen kannst. Aber klar, das hast du natürlich "auch schon anders erlebt". Manchmal kommt nämlich gar keine brauchbare Antwort.

    Zurück zum Thema:

    Ich finde nicht dass Vorschlag 1 überflüssig war.

    Auch deine spätere Ergänzung "135 Fehler bei vorher funktionsfähigem Code" ist keine hinreichende Fehlerbeschreigung.
    Gut wäre statt dessen ein paar Fehlermeldungen (nicht alle 135, aber halt ein paar repräsentative) reinzukopieren. Da drinnen wäre dann vermutlich auch ein Hinweis zu finden gewesen dass du ein C++/CLI Projekt erstellt hast.

    Was den Switch angeht hast du natürlich Recht, es war kein Problem da klar war welchen du vermutlich gemeint hat. So ein Fehler hilft aber mit beim Leser ein bestimmtes Bild zu zeichnen, nämlich dass der Schreiber sich anscheinend die Latte was Genauigkeit angeht nicht sehr hoch legt. Ob jetzt gerechtfertigt oder nicht, aber das passiert halt - zumindest bei manchen Zeitgenossen wie z.B. mir.

    Was dein eigentliches Problem angeht:

    Vorschlag 3 sollte denke ich (hoffe ich) klar sein. Falls nicht kannst du gerne nachfragen.

    Zu Vorschlag 2: Ich hab' VS 2008 nicht installiert, aber unter VS 2005 findet man unter Visual C++/ATL einen Projekttyp "ATL Projekt", wo man dann auf der "Application Settings" Seite als Server Type "Service (EXE)" auswählen kann.
    Das ist zwar dafür gedacht einen COM Server (bzw. eben ein COM Service) zu erstellen, das sollte aber nicht weiter stören. Du lässt einfach die vom Wizard generierte COM Klasse drinnen, nimmst evtl. noch alle Funktionen aus dem Interface raus. Dadurch hast du eine COM Klasse die man halt instanzieren könnte, aber mit der man nix machen kann. Gewinnt zwar keinen Schönheitswettbewerb, aber macht auch nix. In dem Projekt hast du dann eine "Module" Klasse. In dieser "Module" Klasse überschreibst du die Funktion HRESULT PreMessageLoop(int nShowCmd) , und da drinnen kannst du dein Service hochziehen. Weiters überschreibst du die Funktion HRESULT PostMessageLoop() , da kannst du dein Service dann stoppen.

    Oder du verwendest direkt selbst die Service Funktionen - siehe https://msdn.microsoft.com/en-us/library/windows/desktop/ms685974(v=vs.85).aspx.
    Was ich so auf die schnelle in einem Programm von mir finde brauchst du dazu zumindest StartServiceCtrlDispatcher , RegisterServiceCtrlHandler und SetServiceStatus .



  • Hallo hustbaer,

    ich denke wir haben uns da Beide etwas auf dem falschen Huf erwischt. Ich war zu schnell angepisst, was sicherlich genauso falsch ist wie der Unterton. 😉
    Klar machen mehr Fehlerbeschreibungen Sinn und helfen Euch (oder Dir) auch unsere Probleme (in dem Fall nur meine) zu lösen.
    Also sorry von meiner Seite aus. Das mit dem "hab ich schon anders erlebt" bezog sich auf Deinen Unterton und besonders auf Vorschlag 1, aber wie gesagt, vergessen.
    Ich verspreche mir in Zukunft mehr Mühe zu geben was die Beschreibung und die korrekte Wiedergabe von Infos des Systems betrifft. Manchmal hilft ja auch Birne einschalten vorm schreiben. 😉

    Danke für Vorschlag 2. Ich werde es ausprobieren.


  • Mod

    Von PJ Naughter gibt es eine nette Basisklasse für Services. Inkl. Support für die MFC.



  • Hallo,

    es ist ganz einfach, jeder der einen Dienst erstellt, macht sich eines Verbrechens schuldig, man sollte diesen Schmutz aus dem System entfernen.

    Leider ist der Systemhersteller der Kopf der Bande, insbesondere gesellen sich nun noch die App-Verbrechen hinzu.

    Man möge bei der Installation von Win, die Frage gestellt bekommen, für wie dämlich man genommen werden möchte..

    Grüße
    Karsten



  • Das nenne ich doch mal konstruktive Kritik. Das hilft jedem der die Frage gestellt hat auf jeden Fall weiter.



  • @Achromat
    Ich hab' keine Ahnung was du meinst.
    Was ist das Problem mit Diensten?
    Was ist das Problem mit Apps?


  • Mod

    hustbaer schrieb:

    @Achromat
    Ich hab' keine Ahnung was du meinst.
    Was ist das Problem mit Diensten?
    Was ist das Problem mit Apps?

    Don't feed the troll. 😉



  • Don't accept other views

    Unfreundlich wie immer der Martiness...



  • Hier mal ein Dankeschön an hustbaer und Martin. Dank Eurer Tips bin ich weiter gekommen.

    VG
    Ranger



  • Achromat schrieb:

    Don't accept other views

    Unfreundlich wie immer der Martiness...

    Nene.
    Das ist keine andere Ansicht.
    So lange du es nichte rklärst/begründest (was du trotz meiner Aufforderung nicht hast), bleibt es bloss dummes rumgetrolle.


Anmelden zum Antworten