Seite 2 von 3
Re: Programm - nur eine Instanz erlauben
Verfasst: 12.11.2009 00:08
von Mr.Vain
OK,
ich hoffe ja mal, dass man das abschalten kann, bzw - bei gemeinsamen Aufrufs aus einem Netzlaufwerk dies nur einmalig ist.
Re: Programm - nur eine Instanz erlauben
Verfasst: 12.11.2009 13:21
von Mr.Vain
Kaeru Gaman hat geschrieben:hä? wieso zweite exe?
das kommt einfach an den Anfang deines Programms rein, als abfrage, damit dein programm weiß dass es schon läuft.
Wir haben einige externe Programme, die man mehrfach starten kann.
Dies möchte ich verhindern, indem ich dort ein Programm vorschalte -> so in etwa:
check_programm.exe K:\soft\externes_programm.exe
Beim ersten Aufruf soll einfach nur das Programm "externes_programm.exe" starten - beim zweiten Aufruf soll eine Meldung kommen "Nur eine Instanz ist erlaubt".
Das wäre so einfacher, da ich hier nur ein Programm "check_programm.exe" für mehrere Aufrufe nutzen kann.
Re: Programm - nur eine Instanz erlauben
Verfasst: 12.11.2009 13:30
von helpy
Zu den Programmen von Sysinternals.
Das mit der Zustimmung zur EULA hatte mich auch gestört, deshalb habe ich mir vor einiger Zeit schon eine kleine Routine geschrieben:
Code: Alles auswählen
EnableExplicit
; ----------------------------------------------------------------------
; Funktion: CheckSysinternalsEula( ProgramName )
; ----------------------------------------------------------------------
; Diese Funktion überprüft, ob für das Sysinternals Tool ProgramName
; bereits der Eula zugestimmt wurde und setzt die Zustimmung gegebenen-
; falls auf OK.
; Damit kann bei der Verwendung von Sysinternals Tools verhindert werden,
; dass beim ersten Ausführen des Programms, die Abfrage erscheint.
; ----------------------------------------------------------------------
; Ergebnis: #True ..... Eula wurde durch den Anwender bzw. durch diese
; Funktion akzeptiert.
; #False .... Registry konnte nicht gelesen/gesetzt werden.
; ----------------------------------------------------------------------
Procedure CheckSysinternalsEula( ProgramName.s )
Protected dwEulaAccepted.l = -1
Protected DataSize.l = SizeOf( dwEulaAccepted )
Protected hkResult.i
Protected NewKey, KeyInfo
Protected bEulaIsSet = #False
Protected RegSubKey_SysInternals.s, RegEntry_Eula.s
RegSubKey_SysInternals = "Software\Sysinternals\"
RegEntry_Eula = "EulaAccepted"
dwEulaAccepted = -1
DataSize = SizeOf( dwEulaAccepted )
bEulaIsSet = #False
If RegOpenKeyEx_( #HKEY_CURRENT_USER, RegSubKey_SysInternals + ProgramName, 0, #KEY_READ, @hkResult ) = #ERROR_SUCCESS
If RegQueryValueEx_( hkResult, RegEntry_Eula, 0, 0, @dwEulaAccepted, @DataSize) <> #ERROR_SUCCESS
dwEulaAccepted = -1
EndIf
RegCloseKey_( hkResult )
EndIf
If dwEulaAccepted <> 1
dwEulaAccepted = 1
If RegCreateKeyEx_( #HKEY_CURRENT_USER, RegSubKey_SysInternals + ProgramName, 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) = #ERROR_SUCCESS
If RegSetValueEx_( NewKey, RegEntry_Eula, 0, #REG_DWORD, @dwEulaAccepted, SizeOf( dwEulaAccepted ) ) = #ERROR_SUCCESS
bEulaIsSet = #True
EndIf
RegCloseKey_( NewKey )
EndIf
Else
bEulaIsSet = #True
EndIf
;Debug "Checked EulaAccepted of the Sysinternals program " + ProgramName + ": " + Str( bEulaIsSet )
ProcedureReturn bEulaIsSet
EndProcedure
; Debug CheckSysinternalsEula( "PsExec" )
; Debug CheckSysinternalsEula( "PsList" )
Die Funktion habe ich bisher nur auf Windows XP Betriebssystemen getestet!
Für das Tool PsExec funktioniert das einwandfrei! Für andere Tools habe ich das ebenfalls noch nicht getestet. Ich habe mir jedoch den Registry-Eintrag von PsList angesehen und es sollte auch mit CheckSysinternalsEula( "PsList" ) funktionieren!
Vielleicht hilft das ja dem ein oder anderen!?
cu, helpy
Re: Programm - nur eine Instanz erlauben
Verfasst: 12.11.2009 13:58
von c4s
helpy hat geschrieben:Das mit der Zustimmung zur EULA hatte mich auch gestört
Einmalig auf "Accept" klicken ist doch Ok?!
Re: Programm - nur eine Instanz erlauben
Verfasst: 12.11.2009 15:10
von helpy
Wenn das Programm aber wie weiter oben beschrieben von mehreren Anwendern aufgerufen wird, dann kann das schon sinnvoll sein, die EULA per Registry zu setzen. Jetzt müsste man nur noch schauen, was die Lizenz zu dieser Vorgehensweise sagt.
Re: Programm - nur eine Instanz erlauben
Verfasst: 12.11.2009 15:17
von helpy
Es gibt aber einen noch einfacheren Weg:
An das Tool von Sysinternals (eigentlich ist Microsoft ja jetzt der Besitzer/Herausgeber) einfach den Schalter /accepteula anhängen!
Also
im Code des Beitrags eine Zeile wie folgt ändern:
Code: Alles auswählen
helpstring.s="u:\sysinternals\pslist.exe /accepteula > %tmp%\mycheck.log"
Re: Programm - nur eine Instanz erlauben
Verfasst: 12.11.2009 15:42
von bobobo
cool .. hab das oben mal ungetestet eingebaut
Re: Programm - nur eine Instanz erlauben
Verfasst: 12.11.2009 21:50
von Mr.Vain
Ist es nicht auch möglich per P.Basic eine Console zu öffnen (im Hintergrund) - dort pslist.exe zu starten und dann auszuwerten?
Dann bräuchte man das mit der Batch Datei nicht machen...
Re: Programm - nur eine Instanz erlauben
Verfasst: 12.11.2009 22:10
von bobobo
[alt]
glaub mir mal das es so einfacher ist
Aber klar kannst du ne Konsole starten. Aber das "reingucken" per Programm ist mit der Ausgabe von pslist aus
irgendwelchen Gründen nicht so einfach.
[/alt]
JA !
http://www.purebasic.fr/german/viewtopi ... 13#p260313
Re: Programm - nur eine Instanz erlauben
Verfasst: 13.11.2009 13:33
von c4s
bobobo hat geschrieben:glaub mir mal das es so einfacher ist
Aber klar kannst du ne Konsole starten. Aber das "reingucken" per Programm ist mit der Ausgabe von pslist aus
irgendwelchen Gründen nicht so einfach.
Code: Alles auswählen
ProgramID = RunProgram("C:\pslist.exe", "-t", GetPathPart(ProgramFilename()), #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
Repeat
Debug ReadProgramString(ProgramID)
Until AvailableProgramOutput(ProgramID) = 0
;KillProgram(ProgramID)
CloseProgram(ProgramID)
Funktioniert doch bestens!?