Seite 1 von 1

PBOSL - AppRunning() immer 0

Verfasst: 23.03.2007 09:30
von Rico
Hallo,

ich wollte mit PB3_94 die Funktion AppRunning (PBOSL) dazu benutzen, um zu prüfen ob ein anderes Programm bereits bzw. ob es noch gestartet ist.

Egal was ich mache, die Funktion gibt mir immer 0 zurück - ob das Programm nun definitiv gestartet ist oder nicht ...

Code: Alles auswählen

If AppRunning("Testprogramm.exe")
  MessageRequester("Läuft","Die Anwendung läuft")
Else
  MessageRequester("Läuft nicht","Die Anwendung läuft nicht")
EndIf
End
Kann mir das jemand bitte erklären?

Gruß Rico

Verfasst: 23.03.2007 13:45
von bobobo
Ich hatte das mal benutzt .. da hatte ich als Parameter den komplette
ProgrammPfad mit übergeben .. aberso richtig glücklich hat mich das
nie gemacht

Für Windoof ab Nt geht es auch folgendermaßen und dann ohne Pfad

Code: Alles auswählen

ExamineProcesses()
While NextProcess()
  If LCase(GetProcessName())="testprogramm.exe"
    rennt=1
  EndIf
Wend
If rennt
  MessageRequester("Testprogramm","Läuft",0)
  Else
  MessageRequester("Läuft","Läuft nicht",0)
EndIf

Verfasst: 23.03.2007 13:54
von Rico
Naja, brauche das leider auch für Rechner mit Windows 98.

Habe mich jetzt noch etwas auf dem Board umgeschaut und einen Thread gefunden in dem Thorsten1867 :allright: mir eine Lösung bietet

siehe hier:
http://www.purebasic.fr/german/viewtopi ... findwindow


Gruß Rico

Verfasst: 23.03.2007 14:49
von ts-soft
Rico hat geschrieben: Habe mich jetzt noch etwas auf dem Board umgeschaut und einen Thread gefunden in dem Thorsten1867 :allright: mir eine Lösung bietet

siehe hier:
http://www.purebasic.fr/german/viewtopi ... findwindow


Gruß Rico
Du solltest lieber den Mutex nutzen, das funktioniert dann genauso wie
AppRunning. Statt des Appnamen aber besser einen GUID String!

Code: Alles auswählen

Procedure OnlyOne(MutexName.s)
  Protected result.l = CreateMutex_(0, 0, @MutexName)
  If GetLastError_() = #ERROR_ALREADY_EXISTS
    ReleaseMutex_(result)
    CloseHandle_(result)
    End
  EndIf
  ProcedureReturn result
EndProcedure

Define.l MyMutex = OnlyOne("{8134EB66-4D60-4E1E-8F0D-582E6173580C}"); Beispiel GUID, bitte selber eine erstellen


; am Programmende, das passiert bei der Lib automatisch, im Code muß man das leider manuell machen
CloseHandle_(MyMutex)
GUID erstellen:

Code: Alles auswählen

Procedure.s MakeGUID()
  LBuffer.s = Space(76)
  CoCreateGuid_(GuidId.GUID)
  StringFromGUID2_(GuidId, LBuffer,76);
  CompilerIf #PB_Compiler_Unicode
    ProcedureReturn LBuffer
  CompilerElse
    SBuffer.s = Space(38)
    WideCharToMultiByte_(0, 0, LBuffer, 76, SBuffer, 38, 0, 0);
    ProcedureReturn SBuffer
  CompilerEndIf
EndProcedure
Debug MakeGUID()

Verfasst: 23.03.2007 15:19
von bluejoke
Ich denke er benötigt diese Funktion für fremde Programme, nicht für eigene.

Verfasst: 23.03.2007 15:21
von ts-soft
bluejoke hat geschrieben:Ich denke er benötigt diese Funktion für fremde Programme, nicht für eigene.
Dann hab ich es verkehrt verstanden.
Dann sollte er lieber durch die Prozesse iterieren, das sollte ja auch
irgendwie unter Win9x möglich sein. FindWindow ist jedenfalls mit Vorsicht zu
geniessen, gibt schnell "Falschfindungen" :mrgreen:

Verfasst: 23.03.2007 15:44
von bluejoke
Die Funktion von Thorsten überprüft doch die Prozesse, nicht die Windows - ganz unten, der letzte Post ist doch was Rico meint.

Verfasst: 23.03.2007 15:57
von ts-soft
bluejoke hat geschrieben:Die Funktion von Thorsten überprüft doch die Prozesse, nicht die Windows - ganz unten, der letzte Post ist doch was Rico meint.
Okay, gewonnen :wink:
Warum lädt er in dem Code die Kernel32.dll, sind doch alle API-Funktionen
verfügbar, oder soll das für eine Demo-Version sein?
Hab den Source dort mal überarbeitet :wink:

Verfasst: 23.03.2007 23:02
von Rico
Guten Abend,

bluejoke hat Recht - ich meinte den letzten Post in dem Beitrag.

Ich will ein Auto-Update in mein Programm integrieren und versuchte mich mit dem Code aus dem Thread http://www.purebasic.fr/german/viewtopi ... r&start=10
(auch wieder der letzte Post). Dabei wird eben ein zweites Programm geladen und das eigentliche Programm muss beendet sein, damit die ganze Sache geht. Leider funzte das mit dem "If AppRunning=0" nicht, so dass ich einen Ersatz suchte.

MfG Rico

Verfasst: 13.11.2008 08:44
von saimen
Damit bin ich jetzt zufrieden:

Code: Alles auswählen

;Anwendung nur einmal starten zulassen
If AppRunning("anwendung.exe")
   MessageRequester("Anwendung","Anwendung wurde bereits gestartet!",#MB_ICONASTERISK) 
   End  
EndIf