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!?