GetExePath MultiOS PB4

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
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

GetExePath MultiOS PB4

Beitrag von ts-soft »

Code: Alles auswählen

Procedure.s GetExePath()
  Protected ExePath.s = GetPathPart(ProgramFilename())
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    If ExePath = #PB_Compiler_Home + "Compilers\" : ExePath = GetCurrentDirectory() : EndIf
  CompilerElse
    If ExePath = GetTemporaryDirectory() : ExePath = GetCurrentDirectory() : EndIf
  CompilerEndIf
  ProcedureReturn ExePath
EndProcedure
Wird immer wieder gefragt. Relative Pfade für Dateien sollten immer mit dem
Ergebnis dieser Procedure addiert werden!
Beispiel:

Code: Alles auswählen

LoadImage(0, GetExePath() + "bilder\big.bmp")
Nur der relative Pfad funktioniert unter Linux garnicht und unter
Windows kommt es auf die Art und Weise des Aufrufs drauf an,
also nicht sicher!
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
Little John

Re: GetExePath MultiOS PB4

Beitrag von Little John »

Danke für die Prozedur und die Erläuterungen! Es wäre sicher nur eine Frage der Zeit gewesen, bis ich über das Problem gestolpert wäre.

Ich habe zwei kleine Verbesserungsvorschläge:

a) Bei mir ( unter Windows 98 ) muss es heißen

Code: Alles auswählen

If UCase(ret) = #PB_Compiler_Home + "COMPILERS\"
sonst funktioniert der Vergleich nicht.

[edit]
Sorry, das stimmt so nicht, weil ich eine Variable umbenannt hatte. Gemeint war:

Code: Alles auswählen

If UCase(ExePath) = #PB_Compiler_Home + "COMPILERS\"
[/edit]

Vielleicht sollte man sicherheitshalber auch besser

Code: Alles auswählen

UCase(#PB_Compiler_Home)
schreiben?

b) Ich denke der Name "GetProgPath()" wäre zutreffender, denn soweit ich es verstehe, muss das betr. Programm keine EXE-Datei sein. Es kann sich ja auch um ein Programm handeln, das innerhalb der IDE ausgeführt wird, oder?

Gruß, Little John
Zuletzt geändert von Little John am 01.11.2006 16:04, insgesamt 1-mal geändert.
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

Re: GetExePath MultiOS PB4

Beitrag von ts-soft »

Little John hat geschrieben: a) Bei mir ( unter Windows 98 ) muss es heißen

Code: Alles auswählen

If UCase(ret) = #PB_Compiler_Home + "COMPILERS"
sonst funktioniert der Vergleich nicht.
Der Ordner wird unter allen Windowssystemen mit dem gleichen Namen angelegt, "COMPILERS" hab ich noch nie gesehen.
Little John hat geschrieben: Vielleicht sollte man sicherheitshalber auch besser

Code: Alles auswählen

UCase(#PB_Compiler_Home)
schreiben?
siehe oben
Little John hat geschrieben: b) Ich denke der Name "GetProgPath()" wäre zutreffender, denn soweit ich es verstehe, muss das betr. Programm keine EXE-Datei sein. Es kann sich ja auch um ein Programm handeln, das innerhalb der IDE ausgeführt wird, oder?
Programmierer sprechen beim Source von einem Programm. Das andere
ist die ausführbare Datei, eben die "Exe" :wink:
Diese Routine erkennt automatisch, wenn sie in der IDE ausgeführt wird,
und korrigiert den Pfad auf das aktuelle Verzeichnis, das in diesem Falle
vom Compiler gesetzt wurde.

Gruß
Thomas
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
Little John

Re: GetExePath MultiOS PB4

Beitrag von Little John »

ts-soft hat geschrieben:
Little John hat geschrieben: a) Bei mir ( unter Windows 98 ) muss es heißen

Code: Alles auswählen

If UCase(ret) = #PB_Compiler_Home + "COMPILERS"
sonst funktioniert der Vergleich nicht.
Der Ordner wird unter allen Windowssystemen mit dem gleichen Namen angelegt, "COMPILERS" hab ich noch nie gesehen.
Ich verstehe Deine Antwort nicht -- vielleicht liegt hier ein Missverständnis vor. Siehe bitte auch das "Edit" in meinem ersten Beitrag dieses Threads.
Ich hatte sagen wollen, dass bei mir der Vergleich so wie Du ihn formuliert hattest immer #False ist, was ja nicht Sinn der Sache sein kann. GetPathPart(ProgramFilename()) liefert nämlich bei mir einen String, der ausschließlich aus Großbuchstaben besteht. Daher muss es im Vergleichsstring eben nicht "Compilers" heißen, sondern "COMPILERS". Generell ist es unter Windows eine gute Idee, Pfad- und Dateinamen unabhängig von Groß-/Kleinschreibung zu vergleichen, da Windows -- anders als Linux -- Groß- und Kleinschreibung in Dateinamen nicht unterscheidet (außer für die Optik).
ts-soft hat geschrieben:
Little John hat geschrieben: b) Ich denke der Name "GetProgPath()" wäre zutreffender, denn soweit ich es verstehe, muss das betr. Programm keine EXE-Datei sein. Es kann sich ja auch um ein Programm handeln, das innerhalb der IDE ausgeführt wird, oder?
Programmierer sprechen beim Source von einem Programm. Das andere ist die ausführbare Datei, eben die "Exe" :wink:
Sicher handelt es sich bei Source-Code um ein Programm -- aber auch z.B. EXE- oder COM-Dateien sind Programme (eben in binärer Form). "Programm" ist der Oberbegriff. Wenn Source-Code gemeint ist, sollte auch Source-Code geschrieben werden, dafür wurde der Begriff erfunden. ;)
ts-soft hat geschrieben:Diese Routine erkennt automatisch, wenn sie in der IDE ausgeführt wird, und korrigiert den Pfad auf das aktuelle Verzeichnis, das in diesem Falle vom Compiler gesetzt wurde.
Dann habe ich das ja richtig verstanden. ;)
Und da sich in der IDE der Quelltext (bei dem es sich um ein Programm handelt, da sind wir uns ja einig) befindet, und keine EXE-Datei, ist IMHO eben der Name GetProgPath() passender.

Gruß, Little John
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 »

Der Pfad, ausschließlich "Compilers" wird ermittelt, sollte also stimmen, wenn
jemand aus Compilers COMPILERS macht, ist das sein Problem.

Es ist aber sicher besser nicht Casesensitiv zu vergleichen, aber in diesem
Fall halte ich es für unnötig. Kannst es Dir ja anpassen, diese Zeilen wirken
sich ja sowieso in der fertigen Anwendung nicht aus, sondern nur die Erste.

Exe <> Programm
In der Ide compiliert wird auch eine Exe ausgeführt, wenn diese auch
temporär generiert wird.
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
Little John

Beitrag von Little John »

ts-soft hat geschrieben:wenn jemand aus Compilers COMPILERS macht, ist das sein Problem.
Ich habe nicht aus Compilers COMPILERS gemacht, sondern so wie ich es geschildert habe, wurde es vom PB-Installationsprogramm eingerichtet.
ts-soft hat geschrieben:In der Ide compiliert wird auch eine Exe ausgeführt, wenn diese auch temporär generiert wird.
Ja, aber Dein Code liefert den Pfad zur Quelltext-Datei, und nicht den Pfad zur temporären EXE-Datei. Daher mein Vorschlag, der Klarheit halber keinen irreführenden Namen zu verwenden.

Wie gesagt nur "kleine Verbesserungsvorschläge".

Gruß, Little John
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

das liegt am arbeitsverzeichniss
Wenn man das Programm über verknüpfungen oder über runprogram aufruft kann man dieses angeben.
(habe mir nich alles durchgelesen deswegen sry für evt doppelpost)
//edit>: durchgelesen:
eine gleichung achtet auf groß/kkleinschreibung also a<>A
Antworten