linux und RunProgram

Anfängerfragen zum Programmieren mit PureBasic.
beowulf6
Beiträge: 8
Registriert: 03.10.2006 21:19
Kontaktdaten:

linux und RunProgram

Beitrag von beowulf6 »

Hallo. bin neu hier und habe schon ziemlich viel alleine geschafft.

nun habe ich jedoch ein problem, an dem ich nicht weiterkomme obwohl es funktionieren müsste.

ich mache einen RunProgram() wie folgt:

Code: Alles auswählen

RunProgram("message", "10 hallotest", "")
jetzt zum seltsamen verhalten. Teste ich das Programm in der IDE mit "Kompilieren/Starten" dann läuft diese Funktion wie gewünscht. es wird die Anwendung gestartet und die Parameter übergeben.

wenn ich jedoch die Anwendung final kompiliere funktioniert das ganze nicht mehr.
ich bekomme aber auch immer einen Zahlenwert ungleich 0 von RunProgram zurückgeliefert egal ob von der IDE aus gestartet oder als Ausführbares Programm. (das Programm message ist natürlich auch ausführbar gemacht)

an anderer stelle habe ich bereits firefox erfolgreich starten können (mit absolutem Pfad)

Code: Alles auswählen

RunProgram("/usr/bin/firefox", "http://www.google.de", "")
ebenfalls habe ich schon versucht mit folgender Funktion den Anwendungspfad herauszufinden.

Code: Alles auswählen

Procedure.s GetCurrentDir()
	Protected CurDir.s
	CurDir.s = Space(2048)
	CompilerIf #PB_Compiler_OS = #PB_OS_Linux
		getcwd_(CurDir, 2048)
	CompilerElse
		GetCurrentDirectory_(2048,CurDir)
	CompilerEndIf
	ProcedureReturn CurDir + "/"
EndProcedure
selbst mit diesem Code funktioniert es in der IDE, als eigenständige Anwendung jedoch nicht.

als eigenständige Anwendung scheint dieser Code aber auch immer mein Homeverzeichnis auszugeben.

ich benutze PureBasic 3.94 (Linux - x86)

Ich hoffe ich habe mich verständlich ausgedrückt und ihr könnt mir helfen.
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Beitrag von vonTurnundTaxis »

Probier mal System_("programmname ---parameter").
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
beowulf6
Beiträge: 8
Registriert: 03.10.2006 21:19
Kontaktdaten:

Beitrag von beowulf6 »

Danke für die schnelle Antwort.

bei System_() besteht leider das gleiche Problem, wobei zusätzlich das komplette Programm angehalten wird, und erst beim beenden des gestarteten Programms wieder fortgesetzt wird.

ich habe noch ein wenig weiterprobiert, und es scheint etwas mit dem Arbeitsverzeichnis zu sein.

Starte ich mein Programm das die andere Anwendung ausführen soll, indem ich in der Konsole erst in das Verzeichnis meines Programms wechsele und dort mein Programm mit
./meinprogram
dann funktioniert alles wie gewünscht. gehe ich jedoch ein Verzeichnis runter und führe es mit
dasverzeichnis/meinprogram
aus, ist das Problem wieder da.

jetzt habe ich bereits eine KDE verknüpfung erstellt (program.desktop)
und dort das entsprechende Arbeitsverzeichnis definiert.

die Verknüpfung startet dann ein Script

Code: Alles auswählen

# !/bin/sh
#
exec ./anwendung.bin
so kann ich die Verknüpfung überall hinverschieben und es geht. jedoch muss beim verschieben der Anwendung wieder das Arbeitsverzeichnis angepasst werden.

Ich hoffe nicht das das ein beabsichtigtes Verhalten ist. (oder an meinem Linux liegt?)
beowulf6
Beiträge: 8
Registriert: 03.10.2006 21:19
Kontaktdaten:

Beitrag von beowulf6 »

Ich habe nach vielem rumprobieren nun doch noch das Arbeitsverzeichnis herausfinden können...

ob es jedoch auf allen Linux Kerneln so geht kann ich leider schlecht sagen.

Code: Alles auswählen

Procedure.s GetCurrentDirB()
;http://www.purebasic.fr/english/viewtopic.php?t=13008&highlight=linux+directory
	*workdir = getenv_("_")
	If *workdir
		Workdirresult$ = PeekS(*workdir)
	Else
		Workdirresult$ = ""
	EndIf
	Workdirresult$ = GetPathPart(Workdirresult$)
	ProcedureReturn Workdirresult$
EndProcedure
;MessageRequester("debug", GetCurrentDirB())
ich habe ein paar infos hier gefunden.
http://www.purebasic.fr/english/viewtop ... +directory

trozdem bleibt es für mich ein Bug, da alle anderen Programme bei mir keine probleme haben.

alternativ wäre auch eine funktion für Linux gut, die wirklich ganz sicher das Arbeitsverzeichnis des Programms herausfindet.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

die 4.0 für Linux befindet sich in der Alpha-Phase.
in der Win-Ver.4.0 ist ein Get/SetCurrentDir enthalten.
...es besteht also hoffnung, dass es auch für die Linux-Kollegen besser wird.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Beitrag von vonTurnundTaxis »

Ja, es wird besser werden :wink:

Bis jetzt verwendet man am besten diese Funktionen (welche auch ganz sicher funktionieren) zum Wechseln/Herausfinden des Arbeitsverzeichnisses:

Code: Alles auswählen

Procedure.s Arbeitsverzeichnis()
  Protected tmp.s
  Ergebnis = getcwd_(*tmp, 0)
  ProcedureReturn RTrim(LTrim(PeekS(Ergebnis)))
EndProcedure

Procedure ArbeitsverzeichnisWechseln(Verzeichnis.s)
  ProcedureReturn chdir_(@Verzeichnis)
EndProcedure
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
beowulf6
Beiträge: 8
Registriert: 03.10.2006 21:19
Kontaktdaten:

Beitrag von beowulf6 »

vonTurnundTaxis hat geschrieben:Ja, es wird besser werden :wink:

Bis jetzt verwendet man am besten diese Funktionen (welche auch ganz sicher funktionieren) zum Wechseln/Herausfinden des Arbeitsverzeichnisses:

Code: Alles auswählen

Procedure.s Arbeitsverzeichnis()
  Protected tmp.s
  Ergebnis = getcwd_(*tmp, 0)
  ProcedureReturn RTrim(LTrim(PeekS(Ergebnis)))
EndProcedure

Procedure ArbeitsverzeichnisWechseln(Verzeichnis.s)
  ProcedureReturn chdir_(@Verzeichnis)
EndProcedure
Auch wenn es nun schon ewig her ist, und ich inzwischen das ganze für mich persönlich über einen riesigen Umweg gelöst habe.. aber die von dir genannte Lösung funktioniert eben nicht "ganz sicher".
Ich habe schliesslich getcwd_() bei meinem aller ersten Post oben bereits angewand. Ich vermute schon fast das es ein generelles problem von KDE ist das es die Konsole immer vom Homeverzeichnis aus startet. daher gibt getcwd_() immer das Homeverzeichnis wieder. (zumindest bei mir) wenn ich die Konsole starte, und manuell in das Programmverzeichnis wechsele, funktioniert es auch, und es gibt das richtige Programmverzeichnis wieder (in das ich ja mit der Konsole gewechselt bin. wechsele ich in der Konsole nicht in das Programm verzeichnis, sondern starte es mit absoluter Pfadangabe aus einem anderen Verzeichnis aus, wird mit den unzähligen genannten varianten eben immer das aktuelle verzeichnis ausgegeben in dem ich in der Konsole als letztes war.).

vielleicht ist das problem mit KDE reproduzierbar?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten