Programm - nur eine Instanz erlauben

Anfängerfragen zum Programmieren mit PureBasic.
Mr.Vain
Beiträge: 88
Registriert: 29.10.2009 00:14

Re: Programm - nur eine Instanz erlauben

Beitrag von Mr.Vain »

OK,

ich hoffe ja mal, dass man das abschalten kann, bzw - bei gemeinsamen Aufrufs aus einem Netzlaufwerk dies nur einmalig ist.
Mr.Vain
Beiträge: 88
Registriert: 29.10.2009 00:14

Re: Programm - nur eine Instanz erlauben

Beitrag 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.
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Programm - nur eine Instanz erlauben

Beitrag 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
Windows 10
PB Last Final / (Sometimes testing Beta versions)
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Programm - nur eine Instanz erlauben

Beitrag von c4s »

helpy hat geschrieben:Das mit der Zustimmung zur EULA hatte mich auch gestört
Einmalig auf "Accept" klicken ist doch Ok?!
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Programm - nur eine Instanz erlauben

Beitrag 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.
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Programm - nur eine Instanz erlauben

Beitrag 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"
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Programm - nur eine Instanz erlauben

Beitrag von bobobo »

cool .. hab das oben mal ungetestet eingebaut
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Mr.Vain
Beiträge: 88
Registriert: 29.10.2009 00:14

Re: Programm - nur eine Instanz erlauben

Beitrag 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...
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Programm - nur eine Instanz erlauben

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Programm - nur eine Instanz erlauben

Beitrag 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!?
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Antworten