Seite 1 von 2

Herausfinden, ob mein Programm schon gestartet wurde

Verfasst: 29.10.2006 19:00
von RSBasic
Hi ihr, ich habe nach einem Code gesucht, um herauszufinden, ob mein Programm schon gestartet wurde. Dabei fiel mir auf, dass die so aufwendig sind. Ich meine auch nicht, dass die über 10 Zeilen haben, aber immerhin. Ich habe für normale User einen Beispiel geschrieben, was sehr einfach zu verstehen ist.
Hier ist mein Code:

Code: Alles auswählen

handle=FindWindow_(0,"Programmtitel")
If IsWindow_(handle)=1
  End
EndIf

Verfasst: 30.10.2006 11:18
von bluejoke
Das funktioniert ja aber nur, wenn das Programm ein Fenster mit einem sich nicht ändernden Fenstertitel geöffnet hat.

Verfasst: 30.10.2006 11:32
von Thorsten1867
Benutze einen MutexString. Hier ein Beispiel aus meinem Programm. Du solltest aber einen eigenen String verwenden (am besten eine GUID):

Code: Alles auswählen

If AppRunning("{7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA}")
  MessageRequester(" EasySetup", "An other copy of EasySetup is running.", #MB_OK|#MB_ICONERROR)
  End
EndIf
Mutex.l = CreateMutex_(0,0, "{7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA}")

.....

CloseHandle_(Mutex)
PS: AppRunning() ist eine Library aus PBOSL

Verfasst: 30.10.2006 12:06
von ts-soft
Thorsten1867 hat geschrieben:Benutze einen MutexString. Hier ein Beispiel aus meinem Programm. Du solltest aber einen eigenen String verwenden (am besten eine GUID):

Code: Alles auswählen

If AppRunning("{7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA}")
  MessageRequester(" EasySetup", "An other copy of EasySetup is running.", #MB_OK|#MB_ICONERROR)
  End
EndIf
Mutex.l = CreateMutex_(0,0, "{7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA}")

.....

CloseHandle_(Mutex)
PS: AppRunning() ist eine Library aus PBOSL
Die Lib AppRunning ist unnötig wenn Du es so machst:

Code: Alles auswählen

Mutex.l = CreateMutex_(0,0, "{7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA}")
If GetLastError_() = #ERROR_ALREADY_EXISTS
  MessageRequester(" EasySetup", "An other copy of EasySetup is running.", #MB_OK|#MB_ICONERROR)
  ReleaseMutex_(Mutex)
  CloseHandle_(Mutex)
  End
EndIf

; ....
; ....


CloseHandle_(Mutex)
Gruß
Thomas

Verfasst: 30.10.2006 12:24
von Shardik
Ein Beispiel von Character aus dem englischen Forum:
http://www.purebasic.fr/english/viewtopic.php?t=23351

Code: Alles auswählen

MutexID=CreateMutex_(0,1,"My Program") 
MutexError=GetLastError_() 
If MutexID=0 Or MutexError<>0 
  ReleaseMutex_(MutexID) 
  CloseHandle_(MutexID) 
  End 
EndIf 


If OpenWindow(0,300,300,200,100,"My Program") 
  While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend 
EndIf 
  

;- Mutex Close 
CloseHandle_(MutexID) 
End
Und eine Erklärung, warum die FindWindow()-Methode nicht verwendet werden sollte, weil sie unzuverlässig ist:
http://www.developerfusion.co.uk/show/1716/5

Re: Herausfinden, ob mein Programm schon gestartet wurde

Verfasst: 30.10.2006 12:56
von Kaeru Gaman
RSBasic hat geschrieben:Dabei fiel mir auf, dass die so aufwendig sind.
Ich habe für normale User einen Beispiel geschrieben, was sehr einfach zu verstehen ist.
aus den postings der kollegen kannst du ersehen, warum es so aufwendig sein muss.
und der "normale User" wird eher dankbar sein für so beispiele wie von ts und Character,
denn wenn er deinen code benutzt, und scheitert, wird er den fehler nicht ausmerzen können.

"Das System hat keinen Fehler, es ist der Fehler."

Verfasst: 30.10.2006 15:39
von Jilocasin
Darf ich mal ganz bescheiden fragen woher diese lustigen Ziffernkombinationen wie hier 7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA kommen? :oops:
Ist das einfach was zum ausdenken oder hat das nen speziellen Zusammenhang?

Verfasst: 30.10.2006 20:31
von Thorsten1867
ts-soft hat geschrieben:Die Lib AppRunning ist unnötig wenn Du es so machst:

Code: Alles auswählen

Mutex.l = CreateMutex_(0,0, "{7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA}")
If GetLastError_() = #ERROR_ALREADY_EXISTS
  MessageRequester(" EasySetup", "An other copy of EasySetup is running.", #MB_OK|#MB_ICONERROR)
  ReleaseMutex_(Mutex)
  CloseHandle_(Mutex)
  End
EndIf
; ....
CloseHandle_(Mutex)
Gruß
Thomas
Danke! Soetwas habe ich schon fast vermutet.

Verfasst: 30.10.2006 20:42
von Friedhelm
Jilocasin hat geschrieben:Darf ich mal ganz bescheiden fragen woher diese lustigen Ziffernkombinationen wie hier 7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA kommen? :oops:
Ist das einfach was zum ausdenken oder hat das nen speziellen Zusammenhang?
Schau hier
http://de.wikipedia.org/wiki/GUID

http://www.purebasic.fr/german/viewtopi ... light=guid

Verfasst: 31.10.2006 10:29
von Thorsten1867
Der Vollständigkeit halber (Abfrage der Prozessliste):

Code: Alles auswählen

Structure PROCESSENTRY33 
  dwSize.l 
  cntUsage.l 
  th32ProcessID.l 
  th32DefaultHeapID.l 
  th32ModuleID.l 
  cntThreads.l 
  th32ParentProcessID.l 
  pcPriClassBase.l 
  dwFlags.l 
  szExeFile.b[#MAX_PATH] 
EndStructure 

Procedure SearchProcess(Name.s) 
  result.b = #False
  If OpenLibrary(0, "Kernel32.dll") 
    CreateToolhelpSnapshot = GetFunction(0, "CreateToolhelp32Snapshot") 
    ProcessFirst           = GetFunction(0, "Process32First") 
    ProcessNext            = GetFunction(0, "Process32Next") 
    If CreateToolhelpSnapshot And ProcessFirst And ProcessNext
      Process.PROCESSENTRY33\dwSize = SizeOf(PROCESSENTRY33) 
      Snapshot = CallFunctionFast(CreateToolhelpSnapshot, $2, 0) 
      If Snapshot 
        ProcessFound = CallFunctionFast(ProcessFirst, Snapshot, Process) 
        While ProcessFound 
          PN$ = UCase(PeekS(@Process\szExeFile))
          If UCase(Name) = GetFilePart(PN$) : result = #True : EndIf
          ProcessFound = CallFunctionFast(ProcessNext, Snapshot, Process) 
        Wend 
      EndIf 
      CloseHandle_(Snapshot) 
    EndIf 
    CloseLibrary(0) 
  EndIf
  ProcedureReturn result
EndProcedure 

If SearchProcess("EasySetup.exe")
  Debug "Programm läuft"
Else
  Debug "Nicht gefunden"
EndIf