Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Programm unkaputtbar machen
Guggsdu
myCSharp.de - Member

Avatar #avatar-1542.jpg


Dabei seit:
Beiträge: 220

Themenstarter:

Programm unkaputtbar machen

beantworten | zitieren | melden

Tach!

Gibt es eine Möglichkeit, ein C#-Progrämmchen unkaputtbar zu machen? Ich meine damit folgendes:

Im Tastmanager kann man unter 'Prozesse' und auch unter 'Anwendungen' eine laufende Applikation auswählen und über 'Task' oder 'Prozess beenden' abschießen. Es gibt aber auch Programme, bei denen kommt dann die Meldung, daß das Beenden zur Zeit nicht möglich sei.

Wie kriegt man dieses Verhalten mit einem eigenen Programm hin?

Gruß
Guggsdu
Gruß
Guggsdu
private Nachricht | Beiträge des Benutzers
Xqgene
myCSharp.de - Member



Dabei seit:
Beiträge: 2.051

beantworten | zitieren | melden

die Programme, die sich nicht über Taskmanager schließen lassen, sind Systemprogramme und laufen mit der Systemnmeldung. So hat normale Benutzer und sogar Admin keine Rechte so ein Programm zu beenden.
"A programmer is a tool which converts coffein to code."

Evely ToDo-Manager 1.2 (Build 1.2.585)
private Nachricht | Beiträge des Benutzers
Guggsdu
myCSharp.de - Member

Avatar #avatar-1542.jpg


Dabei seit:
Beiträge: 220

Themenstarter:

beantworten | zitieren | melden

OK.

Kann man denn dem Programm dann sagen, daß es noch fix was erledigen soll, bevor es ausgeknipst wird? So ähnlich wie der Finalizer, nur daß der bei einem externen Abschuß des Programmes nicht mehr zum Zuge kommt.

Der Hintergrund ist folgender: Ich schreibe bei Beenden des Programmes noch ein paar Daten in eine Datei. Wenn mein Programm aber abgeschossen wird, fehlen diese Eintragungen und das Ganze wird inkonsitent.

Gibt's dafür eine Lösung?


Gruß
Guggsdu
Gruß
Guggsdu
private Nachricht | Beiträge des Benutzers
Xqgene
myCSharp.de - Member



Dabei seit:
Beiträge: 2.051

beantworten | zitieren | melden

Zitat
Original von Guggsdu
Kann man denn dem Programm dann sagen, daß es noch fix was erledigen soll, bevor es ausgeknipst wird?

Nein

[EDIT]
Na ja du kannst noch ein Prog parallel laufen lassen, das dein Hauptprog überwacht. Wenn dein Hauptprog plötzlich nicht mehr da ist, schreibt das Überwachungsprogramm die fehlenden Daten.

Aber man soll seine Application so aufbauen, dass auch beim Absturz keine Inkonsistente Daten enstehen.
[/EDIT]
"A programmer is a tool which converts coffein to code."

Evely ToDo-Manager 1.2 (Build 1.2.585)
private Nachricht | Beiträge des Benutzers
Ftee
myCSharp.de - Member



Dabei seit:
Beiträge: 71

beantworten | zitieren | melden

Was soll das für ein Programm sein, wo der User Lust haben sollte es abzuschiessen?
Das mach ich z.B. nur, wenn das Programm abgestürzt ist.

Ist es da nicht sinnvoller, das Programm absturzsicher zu machen?
private Nachricht | Beiträge des Benutzers
Vellas
myCSharp.de - Member



Dabei seit:
Beiträge: 842

beantworten | zitieren | melden

Hi!

Man kann testen ob der Benutzeraccount berechtigt ist das Prog herunterzufahren. Dann könnte man es so einrichten das nur ein bestimmter Benutzerrang dieses beenden darf.

Wenn du was machen willst, wenn das Programm beendet wird, ginge dies mit dem OnClose (oder OnExit?) Ereignis. Ansonsten musst du wie bereits gesagt eine zweite Anwendung entwerfen, welche deine Hauptanwendung überwacht, wobei dann dieses Prog nicht beendet werden dürfte.

Also ich sehe da abgesehen von BS-Anwendungen keinen Sinn drin. Wenn es einem User so viel Spass macht seine Programme abzuschießen so lasse man ihn das tun, wenn er damit glücklich ist. Besser ist es wirklich wie Ftee schon sagt, eine sichere Anwendung zu programmieren, was teilweise zu einer Aufgabe "ohne Ende" werden kann.


Code-Hacker
private Nachricht | Beiträge des Benutzers
Franknstein
myCSharp.de - Member



Dabei seit:
Beiträge: 529

beantworten | zitieren | melden

Sorge doch einfach dafür, dass das Programm beim Starten die Daten nur ausliest, Änderungen in irgenteiner dämlichen TMP-Datei speichert und dann aber NUR dann wenn das Programm ordnungsgemäß beendet wird, die Daten ändert die beim nächsten Start geladen werden. So verhinderst du auch größtenteils Fehler, falls dein Programm mal sich selbst zerschießt. Und falls dein Programm sich nicht zerschießen kann, ist so ein Vorgehen dennoch ratsam, denn den Resetknopf kannst du nicht sperren ....

Aber ich glaube dass die Destruktoren immer ausgeführt werden, da diese vom GC aufgerufen werden... ( ist aber nicht sicher)


--
mfg
Franknstein
Besuchen sie das VisualC++ - Forum
private Nachricht | Beiträge des Benutzers
Ftee
myCSharp.de - Member



Dabei seit:
Beiträge: 71

beantworten | zitieren | melden

Also erstmal kannst du alles abfangen vergessen, wenn die Application über den PROZESSmanager rausgeworfen wird. Zumindest war das sonst bei "alten" Windows-Anwendungen so. Entfernst du den Prozess, ist die Application auf einmal komplett weg.
Nix Destruktor oder ähnliches, der Speicherbereich wird ein einfach gelöscht.

Habe ich ausgiebig getestet, weil ich mal vor einem ähnlichen Problem stand.

Über einen Umweg kannst du folgendes machen, ohne der Anwendung Systemstatus zu geben:

Die Anwendung selbst machst du erstmal "Captionless", d.h. du gibts der Form keinen Text mit. Damit taucht die auch nicht mehr bei "Anwendungen" im Taskmanager auf.

Dann verkrüppelst du den Taskmanager noch ein wenig:
"DisableRegistryTools" in "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System" auf "1" setzen. Damit ist die Geschichte auch gegessen.
Das setzt du übrigens alle halbe Sekunde, nicht das es einer wieder einstellt

Wenn du jetzt noch:
- zwei Anwendungen startest, die sich gegenseitig permanent ein ping-pong zuschieben, und schlagartig Windows forced (d.h. ohne jegliche Rückfrage!) runterfahren wenn eine der Anwendungen fehlt
- beide in die Autostart der Reg schreibst, und ausschaltest das jemand beim booten das Menü hervorzaubert (in der MSDOS.sys "BootKeys=0" setzen)
..... dann wirds richtig knifflig Windows ohne die Anwendung(en) überhaupt erst mal starten zu lassen.
Zumindest mit Bordmitteln und ohne fremde Hilfe ists nahezu unmöglich. Dazu müsste derjenige zuerst erstmal raffen WAS da eigentlich alles abgeht....

Ich kann davor allerdings NUR warnen!!!!
Ich habe beim testen dieser besagten Application und der darauf folgenden Neuinstallation (weil eben NICHT jede Hintertür immer so klappt wie man sich das vorstellt!) ungefähr 3-5 verschiedene Hintertüren eingebaut, die ich auch oft genug nutzen musste.

Es ist ein Scheissgefühl wenn man seinen Rechner zwar starten kann, aber nur 3 Sekunden was davon hat, weil er dann wieder runtergefahren wird.....
private Nachricht | Beiträge des Benutzers
Ftee
myCSharp.de - Member



Dabei seit:
Beiträge: 71

beantworten | zitieren | melden

Es fehlt natürlich noch, das du Sonderzeichen im Dateinamen der Anwendung nimmst... dann ist auch der Konsoleexperte ziemlich aufgeschmissen..... ich weiss nicht wie es unter XP/2000 ist, aber unter win98 reichte ein Leerzeichen an erster Stelle damit es nicht mehr aufgelistet wird......
private Nachricht | Beiträge des Benutzers
Franknstein
myCSharp.de - Member



Dabei seit:
Beiträge: 529

beantworten | zitieren | melden

@Ftee
Sicher das der Destruktor nicht noch ausgeführt wird? Ich habe immer gedacht, das System lässt dem Programm noch x ms nach dem Senden der Schließen-Message bis das Programm aus dem Prozessseduler fliegt....
Zitat
Ich kann davor allerdings NUR warnen!!!!
Ich habe beim testen dieser besagten Application und der darauf folgenden Neuinstallation (weil eben NICHT jede Hintertür immer so klappt wie man sich das vorstellt!) ungefähr 3-5 verschiedene Hintertüren eingebaut, die ich auch oft genug nutzen musste.

Es ist ein Scheissgefühl wenn man seinen Rechner zwar starten kann, aber nur 3 Sekunden was davon hat, weil er dann wieder runtergefahren wird.....
Hammer, das übertrifft sogar meine FatDateiSystemDurchEndlosesOrdnerErzeugenZerschießenC-Programm.exe!!!

Waren die Anwendungen .net-Exen? Wenn ja, dann kann man die WindowsCd an den Start bringen und die mscorelib.dll nach Wiesen schicken.... Und wenn nicht kann man ja mit delte *.exe auf die Exejagd gehen ohne den Dateinamen zu kennen, natürlich aus der Wiederherstellungskonsole....

--
mfg
Franknstein
Besuchen sie das VisualC++ - Forum
private Nachricht | Beiträge des Benutzers
Lynix
myCSharp.de - Member



Dabei seit:
Beiträge: 667
Herkunft: Saarland

beantworten | zitieren | melden

*rofl*

Also wenn ich durch Zufall mal in den Genuß komme, so nen Programm von Euch auf meinem Rechner laufen zu haben, dass mir die Registry alle 5 Sekunden verfusselt, damit ich es nicht mehr zu machen kann und mir auch ansonsten alles "verkrüppelt" dann verklag ich Euch auf Schadenersatz nur mal soviel zu dem Thema

Nee, mal im Ernst, also ich bin der Meinung, wenn der Benutzer ein Programm über den Taskmanager abschiesst, braucht er sich nicht darüber zu wundern, wenn das Programm nicht mehr so arbeitet wie es soll. Wenn seine Daten dann hops sind bzw. nicht mehr geschrieben werden isser halt selber schuld. Ich kenne keinen Support der für sowas kostenlos aufkommt, also da würd ich mir keine Sorgen drum machen.
"It is not wise to be wise" - Sun Tzu
private Nachricht | Beiträge des Benutzers
Ftee
myCSharp.de - Member



Dabei seit:
Beiträge: 71

beantworten | zitieren | melden

Zitat
Original von Franknstein
@Ftee
Sicher das der Destruktor nicht noch ausgeführt wird? Ich habe immer gedacht, das System lässt dem Programm noch x ms nach dem Senden der Schließen-Message bis das Programm aus dem Prozessseduler fliegt....

zu 99% ....
Ich habe damals mit Borland C++ Builder gearbeitet, und hatte auf ALLEN Events die das MainWindow hergab UND vor dem letzten "return" der Main() Code eingefügt, der zumindest ne Exception hätte erzeugen müssen..... nichts, nothing. Ich konnte das absolut nicht abfangen, es verschwand einfach sang und klanglos.....

Habe ich es im Tab "Anwedungen" beendet, kamen diese Events, aber nicht wenn ich den Prozess gekillt habe.

Zitat
Original von Franknstein
Hammer, das übertrifft sogar meine FatDateiSystemDurchEndlosesOrdnerErzeugenZerschießenC-Programm.exe!!!

Waren die Anwendungen .net-Exen? Wenn ja, dann kann man die WindowsCd an den Start bringen und die mscorelib.dll nach Wiesen schicken.... Und wenn nicht kann man ja mit delte *.exe auf die Exejagd gehen ohne den Dateinamen zu kennen, natürlich aus der Wiederherstellungskonsole....

Nein, es waren ganz normale exen. NET gabs da noch nicht
Die haben über UDP Ping-Pong gespielt, indem sie sich ständig neue MD5-Hashes des (mit der Seriennummer der Festplatte immer wieder verrechneten) empfangenen Hashes zugespielt haben. War einer fehlerhaft oder fehlte: zack, aus, ohne Rückfrage... auch Nachfragen ala "wollen sie nicht noch speichern?" von beliebigen Editoren kommt nicht mehr.....

Ohne Win-CD und Registry-Tool ist da kaum ein beikommen..... und wie gesagt, dazu müsste man erstmal wissen, wieso da was eigentlich passiert....

Und mein Fehler war, das ich eben beim debuggen "übersehen" hatte, das shutdown auszukommentieren...... ich habe ziemlich blöd geguckt, als der Test erfolgreicher war als ich dachte....
Und ins Internet kommt man ja nicht, um da mal zu schauen....
private Nachricht | Beiträge des Benutzers
Ftee
myCSharp.de - Member



Dabei seit:
Beiträge: 71

beantworten | zitieren | melden

Zitat
Original von Lynix
*rofl*

Also wenn ich durch Zufall mal in den Genuß komme, so nen Programm von Euch auf meinem Rechner laufen zu haben, dass mir die Registry alle 5 Sekunden verfusselt, damit ich es nicht mehr zu machen kann und mir auch ansonsten alles "verkrüppelt" dann verklag ich Euch auf Schadenersatz nur mal soviel zu dem Thema

na? die EULA nicht gelesen? )))))

Übrigens machen die permanenten Zugriffe auf die Reg kaum einen Performance-Unterschied..... einzig die Festplattenleuchte leuchtet dauernd


Zitat
Original von Lynix
Nee, mal im Ernst, also ich bin der Meinung, wenn der Benutzer ein Programm über den Taskmanager abschiesst, braucht er sich nicht darüber zu wundern, wenn das Programm nicht mehr so arbeitet wie es soll. Wenn seine Daten dann hops sind bzw. nicht mehr geschrieben werden isser halt selber schuld. Ich kenne keinen Support der für sowas kostenlos aufkommt, also da würd ich mir keine Sorgen drum machen.

Als ich das immer weiter in die Spitze trieb, habe ich mir auch gedacht was fürn Kasperkram die "normalen" Viren sind...... wenn man sich wirklich Mühe gibt, macht man so noch nichtmal direkt Schaden, sondern fordert den Benutzer über Umwege selbst zu ner Neuinstallation auf
private Nachricht | Beiträge des Benutzers
Lynix
myCSharp.de - Member



Dabei seit:
Beiträge: 667
Herkunft: Saarland

beantworten | zitieren | melden

Jo klar, es macht keinen Performance-Unterschied, aber ich würd mich als Benutzer fragen ob mich der Hersteller der Software verarschen will, wenn er ständig in meiner Registry rumfummelt und mir damit auch noch normale Windows-Funktionen unzugänglich macht. Irgendwas an der Registry zu machen sollte ohnehin immer die letzte Alternative sein und wo es nur geht vermieden werden. Die Registry ist nun mal ein empfindlicher Bereich des Systems, aus dem man möglichst seine Finger lassen sollte...

Davon agesehen kann man sich auch nicht darauf verlassen, dass der Benutzer, der die Anwendung ausführt überhaupt die Berechtigung hat, auf die Registry zuzugreifen, womit Dein Programm dann unter Umständen gar nicht mehr oder nicht mehr richtig läuft.
"It is not wise to be wise" - Sun Tzu
private Nachricht | Beiträge des Benutzers
Guggsdu
myCSharp.de - Member

Avatar #avatar-1542.jpg


Dabei seit:
Beiträge: 220

Themenstarter:

beantworten | zitieren | melden

Tach zusammen.

Zunächst mal danke für die vielen, vielen Zuschriften und Anregungen. Ich habe in der Zwischenzeit ein paar Tests und Überlegungen angestellt, die ich euch hier mal auszugsweise posten will:

1.: Wird ein Programm abgeschossen, wird der Destruktor NICHT aufgerufen!

2.: Selbst wenn der Destruktor (beim normalen Beenden) aufgerufen wird, sollte man dort nur noch kurze Prozesse ablaufen lassen. Viele Daten schreiben ist nicht, weil der Destruktor irgendwann abgewürgt wird (unglaublich - ist aber so). Das bedeutet, man implementiert die IDisposable Schnittstelle und läßt dann von Dispose() die Daten schreiben. Das hat zwar mit der Abschießerei nix zu tun, ist aber sehr interessant (finde ich).

3. Ich habe meine Applikation jetzt so optimiert, daß nur noch sehr selten und für einen kurzen Zeitraum inkonsistente Daten bleiben. Konsistente Daten werden sofort geschrieben. Das mimimiert wenigstens das Risiko.


So, dann danke ich euch und wünsche ein schönes WE

Gruß
Falk
Gruß
Guggsdu
private Nachricht | Beiträge des Benutzers
norman_timo
myCSharp.de - Member

Avatar #avatar-1775.jpeg


Dabei seit:
Beiträge: 4.506
Herkunft: Wald-Michelbach (Odw)

beantworten | zitieren | melden

Hallo!

Lieber spät als nie ;-)

Ich wüsste wie es mit Threads geht, denn da gibt es den Befehl lock, welches einen kritischen Abschnitt definiert.

Bin mir nicht sicher, ob das auch bei einer Anwendung funktioniert, aber wenn, dann bräuchtest Du nur deine Datenschreibung in einem lock-Block ausführen.

Sorry, aber hab Beitrag erst jetzt gelesen.

Ciao
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
private Nachricht | Beiträge des Benutzers