Seite 1 von 2
Hilfethema : PureBasic - Process
Verfasst: 17.02.2008 03:41
von STARGÅTE
Tachchen,
ich bin nun bei 4.x über das HilfeThema
PureBasic - Process gestolpert.
Und da steht nun:
Die Prozess Library ermöglicht das Ermitteln von Informationen über das aktuelle Programm sowie das Ausführen anderer Programme und die Kommunikation mit ihnen. Sie bietet einen plattform-unabhängigen Zugriff auf den Umgebungsblock eines Programms, auf Programm-Parameter sowie die Standard Ein- und Ausgabe.
Das hört sich ganz interessant an, ich denke mal diese "Kommunikation" wäre nun eine alternative zu meinem derzeitigen GlobalMemory oder der Zwicshenablage.
Dummerweise gibt es leiner kein Beispielcode zum angucken, hat von euch jemand erfahrung mit den Proceduren:
WriteProgramString, ReadProgramString, GetEnvironmentVariable, SetEnvironmentVariable, ...
Wäre nett wenn mir einer ein Beispielcode zeigen würde, habe bei der Suche nix gefunden
Verfasst: 17.02.2008 13:05
von Andreas_S
Ist gestern (heute) spät geworden was?
Ich hab da was probiert, scheint aber nicht zu funktionieren:
EXE:
Code: Alles auswählen
SetEnvironmentVariable("VAL", "1234")
Repeat
Delay(100)
Until GetEnvironmentVariable("VAL") <> "1234"
MessageRequester("Wichtige Mitteilung", "Die Variable " + Chr(34) + "VAL" + Chr(34) + " wurde geändert!")
Test Code:
Code: Alles auswählen
path$ = OpenFileRequester("EXE auswählen", "", "EXE Datein (*.exe)|*.exe", 0)
If RunProgram(path$)
Debug GetEnvironmentVariable("VAL")
SetEnvironmentVariable("VAL", "4321")
EndIf
So solte es meiner Meinung nach funktionieren...
Andreas
Verfasst: 17.02.2008 15:45
von STARGÅTE
funzt leider nicht
einerseits ist
Debug GetEnvironmentVariable(
"VAL")
leer und die EXE gibt auch keine meldung auf eine änderung.
Verfasst: 17.02.2008 16:24
von KeyKon
Er schreibt ja auch das es eigentlich so gehen müsste aber nicht geht...
Bei mir gehts auch nicht...
EDIT: Wobei ichs jetz hingekriegt hab das es in eine Richtung funktioniert...
EDIT2: Obwohl, es funktioniert nur wenn man die Variable vorher Definiert..
EDIT3: Man kann die Hilfe zu SetEnvironmentVariable auch so interpretieren das es gar nicht zum Austausch gedacht ist sonder nur zur weitergabe beim start...
Verfasst: 17.02.2008 16:44
von PMV
ich glaub environment-variablen gehen so nicht ...
irgend was hab ich da mal gelesen, weis nur nicht mehr wo.
Umgebungsvariablen kann das Vaterprozess erstellen und auch wieder
einlesen. Erstellt das Programm nun ein Kindprozess, so erbt dieser
Prozess die Umgebungsvariablen. Aber wenn der Vaterprozess nun seine
Umgebungsvariablen ändert, berührt das die Umgebungsvariablen
des Kindprozesses nicht. Genau so umgekehrt. Kann sein, dass es sich
dabei nur um die PB-Befehle für die Umgebungsvariablen handelt, und
mit WinAPI geht das ... da hab ich aber absolut keine schimmer mehr.
(alle angaben ohne Gewähr)
Zur Kommunikation zwischen Programmen ist da die Konsole aber
geeignet. Durch WriteProgramString() auf der Vaterprozess seite und
Print() auf der Kindprozess seite können beliebig viele Daten
ausgetauscht werden. Der Kindprozess greift dabei einfach auf die
Konsole zu, als ob er mit einem normalen Benutzer agiert. (Input(),
Print(), PrintN(), usw.) und der Vaterprozess nutzt halt die Befehle der
Prozesslibrary (WriteProgramString(), WriteProgramStringN(), usw.)
MFG PMV
Verfasst: 17.02.2008 16:47
von KeyKon
Genau das hab ich mir auch gedacht, aber die Hilfe beschreibt das sehr zweideutig...
Aber das mit der Console is auch nich grad das gelbe vom Ei... Ich Benutze weiterhin einfach das Netzwerk dafür...
Wär einfach zu schön gewesen wenns so einfach geht^^
Verfasst: 17.02.2008 16:55
von PMV
Hm, die Konsole ist eigentlich besser, als Netzwerk ... was ist, wenn auf
dem Zielsystem keine Netzwerkprotokolle installiert sind? Oder wegen
sicherheit deaktiviert? ... dann hast ein Problem

... mal davon
abgesehen das Server auch von außen angegangen werden können,
auch wenn meist ne Firewall usw. den entsprechenden Port eigentlich
sperrt.
Und rohe Daten können inzwischen auch mit den PB-Befehlen so
übertragen werden. Die Konsole sieht der Benutzer nicht und ist min.
genau so einfach zu realisieren wie über Netzwerk. Aber am ende
vermutlich doch nur geschmackssache.
MFG PMV
Verfasst: 17.02.2008 17:01
von KeyKon
Wohl war, ich hab halt mal damit angefangen Netzwerk zu benutzen weil ich von nichts anderem wusste, und dann hat man so seine Codeschnipsel die man immer weiterverwendet^^
Mal sehen, man hat bestimmt einen Geschwindigkeitsvorteil mit der Console...
Verfasst: 17.02.2008 18:31
von KeyKon
@PMV: Irgendwie krieg ichs nich gebacken

, könntest du ein winziges Test-Program posten?
Verfasst: 17.02.2008 19:10
von PMV
Childprocess.exe
Code: Alles auswählen
OpenConsole()
PrintN("Ich bin der Childprocess.exe")
CloseConsole()
Hauptprogramm
Code: Alles auswählen
EnableExplicit
Define hProcess.l
OpenConsole()
hProcess = RunProgram("ChildProcess.exe", "", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Write | #PB_Program_Hide)
While ProgramRunning(hProcess)
If AvailableProgramOutput(hProcess)
PrintN("Childprocess.exe: " + ReadProgramString(hProcess))
Else
Delay(1)
EndIf
Wend
PrintN("ChildProcess.exe wurde beendet")
Input()
Das einfachste vom einfachen
Edit: irgend was musste ich ja falsch machen
MFG PMV