Laufendes Programm über Task suchen

Hallo
naja die bisherigen Löungen helfen mir leider nicht weiter bzgl.
ob ein Programm ein 2.mal läuft.
Endweder es funktioniert nur genau mit der gleichen Exe-Datei (gleicher Name), den gleichen Ordner, von wo es gestartert wird oder über das Fenster der Anwendung.

Was aber wenn jmd die Datei umbenennt und in einem anderen Ordner startet. Ich habe mal geschaut, scheinbar geht es über den Namen in der Taskliste (das einzige was immer gleich ist!!!).

Frage also, wie bekomme ich den Namen, ob eine Anwendung mit Namen XYZ schon läuft???
Das ganze über die TaskID zu lösen ist leider auch schlecht. Es muß über den Namen gehen.

Mfg Werner

Hallo Werner,

suchst Du das … ?

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
Private Sub Form\_Activate()
 'KPD-Team 1998
 'URL: http://www.allapi.net/
 'E-Mail: [email protected]
 Dim MyStr As String
 'Create a buffer
 MyStr = String(100, Chr$(0))
 'Get the windowtext
 GetWindowText Me.hwnd, MyStr, 100
 'strip the rest of buffer
 MyStr = Left$(MyStr, InStr(MyStr, Chr$(0)) - 1)
 'Triple the window's text
 MyStr = MyStr + MyStr + MyStr
 'Set the new window text
 SetWindowText Me.hwnd, MyStr
End Sub

Gruß, Rainer

wenn
es mir die laufenden Programme ausgibt, ist es das was ich suche.
Werds ausprobieren.

Vielen Dank, Mfg Werner

Hallo

Falls du es nicht über die Prozesse geregelt bekommst würde ich dir einen anderen Lösungsweg vorschlagen.
Setze einfach einen Flag in der Registry (!!Achtung Zugriffberechtigung!!) oder in eine Datei ( in einen System-Ordner. z.B. das Winnt-Verzeichnis). Somit kannst du vom aus Programm abfragen, ob es bereits läuft.
Die Sache mit den Prozessen sind möglich, ABER es gibt starke Unterschiede in den Windows-versionen. (Windows XP ist bei der Prozessverwaltung recht konfortabel.)
Ach ja selbst Symantec arbeitet mit Flags in der Registry. Das weiss ich, da ich bereits entsprechende Flags zurück setzen musste. (LiveUpdate, Ghost…)

Gruß Sven

das wars leider nicht
Hi,
das wars nicht.

Ich brauche die Liste der laufenden Programme, wenn mein Programm gestartet wird.
Dazu geht man normal mit Strg-Alt-Entf in den Taskmanager auf Anwendungen und da stehen sie dann die laufenden Programme.

Diese Liste brauche ich, wenn mein Programm gestartet wird.

Ich habe einen Link gefunden,
http://www.vbarchiv.net/archiv/tipp_details.php?pid=475

nur bringt mir der nichts, weil ich da nur die TaskID bekomme, welche
für die Programme vergeben werden. Die kenne ich aber nicht im Voraus,
daher brauche ich die Namen der Anwendungen, zB in einem String o.ä.

Mfg Werner

Erklärs mir mal wie das gehen soll (vom Prinzip)
Hi
gute Idee, du meinst ich setze 1, wenns läuft, 0 wenns nicht läuft,

wenn jmd anderes es 2x startet wirds geprüft.

Das geht solange das Programm sauber geschlossen wird oder???

Was aber wenn es zwischendurch abstürzt, oder es über das X geschlossen wird??? Dann steht immer noch 1 drin.

Erklär mir das mal mit den Flags.

Mfg Werner

Hallo Werner,

ich weiss zwar nicht warum du meine Lösung nicht genommen hast. Aber nungut :wink:

Mit GetSetting Bekommst du Daten aus der registry
mit SaveSetting kannst du Daten aus der registry schreiben.
Wenn die Form beendet wird, so wird das Ereignis Query_Unload aufgerufen. Das kannst du nutzen um das Flag zurueckzusetzen.

Aber was ist. Programm 1 wird gestartet -> User ändert key in der registry manuell und startet Prog 2 ?

Was ist wenn der das prog unter einem anderen benutzernamen ausführt?
Dies bedeutet, du musst die Daten HKEY_LOKAL_MASCHINE ablegen!
Aber das geht wiederrum nicht mit Getsetting / Savesetting.
Das bedeutet wiederrum einen Imenzen Programmieraufwand :frowning:

Was ist wenn der angemeldete User keine Rechte hat? Auch dann schlägt das schreiben in der registry fehl. Dann müsstest du die Daten in ein File schreiben. Aber was ist wenn dem angemeldeten Benutzer die rechjte fehlen, daten zu schreiben *grübel* Auch dann schlägt die Variante fehl. Wie du siehst, ist das nicht einfach zu realisieren und bedeutet sehr viel tippserei.

Hmm, wie du siehst ist das auch keine sichere Variante!!

MfG Alex

Hallo

Klar ist das mit der Registry viel geschreibe. Und das mit der Datei auch. Das mit den Rechten ist auch richtigt. Habe ich aber vorher auch bereits erwähnt. Es währe aber ein Ansatz.
Das mit der Prozess-ID ist bei nicht ausreichenden Rechten aber auch nicht möglich. Da man nur seine eigene Prozessräume abfragen kann. Da dass auch über Rechte geregelt wird, kann man damit auch auf dem Bauch fallen.

Ich erkläre das mit den Flags:

Du generierst eine Datei. Darin schreibts du z.B. bStart = false;
Beim Starten deiner Anwendung liest du die Datei aus und wertest den Inhalt aus.
Ist der Wert noch auf false gesetzt, kann dein Programm ausgeführt werden. Damit dies sauber geschieht setzt du als erstes den Wert in deiner Datei auf true. -> bStart = true und speichert die Änderung.
Jetzt die Änderung speichern und dann deine Anwendung ausführen. Beim Beendenen deiner Anwendung setzt du den Wert wieder auf false. Dasselbe machst du auch bei deinem Errorhandling. Da mußt du leider durch.
Das ist die Sache miit den Flags. Der wert den du setzen wilt ist beliebig. Man kann 0-1, ja-nein, j-n nehmen.

Die einzelnen Werte der eingelesenen Zeile bekommst du mit einem Split.

Es ist klar das dies viel Schreibarbeit bedeutet. Aber deine Frage hört sich am anfang recht einfach an. Ist aber wenn man sich näher damit beschäftigt auch recht komplex.

Gruß Sven

P.S. Egal welche Variante du machen willst, auf eine entsprechende Prüfung der Rechte kommt es überall an. Da man alles über die Benutzerrechter einschränken kann. Die Frage ist nur was für eine Anwendung man schreibt und ob man die entsprechende benötigten Rechte nicht einfach vergibt. Beim Testen auf jedenfall einen Benutzer mit den gewünschten Rechten anlegen und nicht mit einem Admin testen.

Hallo zusammen

Wenn die Form beendet wird, so wird das Ereignis Query_Unload
aufgerufen. Das kannst du nutzen um das Flag zurueckzusetzen.

Soviel ich weiss fuktioniert das sogar, wenn das Programm über den Taskmrg beendet wird. Aber nicht wenn der Prozess gekillt wird. Probleme wirds auch geben wenn sich der PC so aufhängt, dass nur noch Ausschalt-Knopf gedrückt halten funktioniert oder ähnliches…
Solche Flags haben immer das Risiko, dass das Programm irgendwann nicht mehr gestartet werden kann. Ich weiss ja nicht wieso das Programm so dringend kein zweites mal laufen darf, aber ich bin der Meinung es ist besser, das Programm verursacht in Extremsituationen mal einen Laufzeitfehler, als dass es nicht mehr Startbar ist!

Aber was ist. Programm 1 wird gestartet -> User ändert key
in der registry manuell und startet Prog 2 ?

Also wer wahllos irgend welche Keys in der Registry ändert oder löscht braucht sich nicht zu wundern, wenn manche Programme dann nicht mehr richtig funktionieren!

Was ist wenn der angemeldete User keine Rechte hat?

Das sollte schon im vorraus, z.B. bei der Installation geklärt werden.
Es ist doch normal dass ohne Schreibrechte nicht alle Anwendungen problemlos ausgeführt werden können!

Um aber noch mal zur unplanmäsigen Beedigung des Programmes zurück zu kommen:
Es muss also mit höherer sicherheit herrausgefunden werden, dass das Programm wirklich schon läuft.
Dazu könnte das Programm z.B. alle 5 Sekunden die aktuelle Uhrzeit in ein File oder die Registry schreiben. Dieser Wert wird dann beim starten ausgelesen. Ist er älter, als 5 Sekunden, so läuft das Programm nicht mehr und darf erneut gestartet werden. Das könnte allerdings Probleme geben wenn der User die Systemzeit ändert.
Deshalb eine ähnliche Methode:
Statt der Uhrzeit werden in bestimmten Zeitabständen z.B Werte von 1 bis 9 nacheinander eingetragen. Deim Start wird dann überprüft, ob der Wert sich noch ändert. Bleibt er z.B 5 Sekunden gleich läuft das Programm wohl nicht mehr.
Dann gibt es auch noch die möglichkeit mit dem laufendem Programm zu kommunizieren. Also z.B. schreibt man einen Wert in die Registry. Das laufende Programm überprüft ständig, ob ein Wert erschein. Ist dies der Fall antwortet es, es schreibt also einen Weiteren Wert in die Registry. Das Programm, das gerade überprüft ob es schon läuft wartet eine bestimmte Zeit lang auf diese Antwort. Kommt diese nicht, wird die Anwendung gestartet, anderenfalls wird sie beendet.

Gruss Phil

Hallo,

Statt der Uhrzeit werden in bestimmten Zeitabständen z.B Werte
von 1 bis 9 nacheinander eingetragen. Deim Start wird dann
überprüft, ob der Wert sich noch ändert. Bleibt er z.B 5
Sekunden gleich läuft das Programm wohl nicht mehr.
Dann gibt es auch noch die möglichkeit mit dem laufendem
Programm zu kommunizieren. Also z.B. schreibt man einen Wert
in die Registry. Das laufende Programm überprüft ständig, ob
ein Wert erschein. Ist dies der Fall antwortet es, es schreibt
also einen Weiteren Wert in die Registry. Das Programm, das
gerade überprüft ob es schon läuft wartet eine bestimmte Zeit
lang auf diese Antwort. Kommt diese nicht, wird die Anwendung
gestartet, anderenfalls wird sie beendet.

Somit würde das prog dann max. 9 Sekunden laufen und das ist das was er nicht erreichen möchte! Desweiteren bringt diese Variante auch viele Nachteile mit sich. Ersten würde viel Rechenzeit verbraucht werden. Die HD würde stark fragmentiert werden. Reicht der Speicherplatz (Ansonsten müsste nach dem File gesucht werden).

Es würde regelmässig eine Routine aufgerufen werden. etc.

Wenn ihm aber das nicht stört, fallen mir 2 sichere varianten ein:
Variante 1:

eine sehr sichere Variante, die auch ohne grosse Schreibarbeit zu realisieren ist. Warum baut er nicht einen DDE Server und einen DDE Client in einem?
Sein program schreibt in eine nicht sichtbares textfeld eine Wert ( egal was). Auf dieses Feld die Link Mode Methoden anpassen. Dann ein weiteres unsichtbares Textfeld. Dort auch die Link Mode Methoden anpassen. Läuft das Prog 1 mal, so sendet der DDE Server die Daten. Empfangen tut er aber nichts. Läuft aber eine andere Anwendung, so empfaengt er urploetzlich was. Ergo -> es läuft eine 2 Instanz --> Prog beenden.

Variante 2:

Mit Winsock auf Port xyz
Bsp:

Winsock connect auf port 1001

  • connect erfolgreich ( Daten senden, Bsp. Application Application Name ist Running)
    Wenn dann Nachricht reinkommt
    *Application End, dann Prog beenden, da schon eine Instanz läuft
    *Application Application Name ist Running -> Daten senden Application End
    *Andere Nachricht -> Weiterleiten
  • connect nicht erfolgreich
    *winsock schliessen
    *winsock als server starten -> Methode Listen aufrufen

Wie du siehst führen viele Wege nach Rom :smile: Es ist nur eine Frage des Aufwandes und ob es sich lohnt.

Gruss Phil

Gruss Alex

Hallo

Somit würde das prog dann max. 9 Sekunden laufen und das ist
das was er nicht erreichen möchte!

Man könnte die Zeitspanne natürlich auch erheblich verkürzen, das war ja nur ein Beispiel, das stark an Resourcen gespart hätte.

Ersten würde viel Rechenzeit verbraucht werden.

Solange man keinen Ur-Uralt-Prozessor verwendet sollte sich so ein kleines Timer-Event überhaupt nicht bemerkbar machen.

Die HD würde stark fragmentiert
werden. Reicht der Speicherplatz (Ansonsten müsste nach dem
File gesucht werden).

Eine kleine Zahl in einem File oder der Registry? Das kann ich mir nicht vorstellen! Es wird doch nur ein kleines Fleckchen auf der Festplatte immer wieder überschrieben! (Muss zwar zugeben, dass ich mich mit Festplattenfragmentierung nicht besonders gut auskenne, aber das…)

Es würde regelmässig eine Routine aufgerufen werden. etc.

Wenn ihm aber das nicht stört, fallen mir 2 sichere varianten
ein: (…)

Findest du das einfacher? Ausserdem benötigt das doch sicherlich mehr Resourcen? Winsock bestimmt, mit DDE kenn ich mich nicht so gut aus…

Gruss Phil