Seite 3 von 3

Verfasst: 01.09.2005 18:58
von al90
@ts-soft

Damit würdest Du aber das ergebnis verfälchen und das ist ja nicht
sinn der sache. Wenn ich nun anhand vom AppPath eine Externe
Datei nachladen möchte, würde ich somit auf ein falsches (CurrentDir)
verzeichnis verweisen und die Anwendung würde/könnte crashen.
Das mit mit dem C:\Programme\PureBasic\Compilers\ ist zwar blöd,
aber wie bereits hardfalcon schon sagte, völlig korrekt.

Verfasst: 01.09.2005 19:15
von ts-soft
Irrtum, du findest mit Compilierten Exe den richtigen Pfad, sowie auch mit der PureBasic08915.exe. Der Pfad ist in jedem Fall korrekt. Die "Verfälschung" macht der PBCompiler, was techn. bedingt aber auch notwendig ist.

Verfasst: 01.09.2005 19:24
von al90
Angenommen ich hatte zuvor irgendwo im Code mit CurrentDir das
verzeichnis gewechselt (aus was für einen grund auch immer. z.b. wegen
FileRequester oder so) und möchte nun ein externes File nachladen
das sich im selben (ProgrammDir) befindet. Na fällt Dir jetzt was auf ? :wink:

Ok, currentdir wird bei Deiner methode zwar nur bei /Compilers angewandt,
aber es könnte für das MainProgram fatal sein.

BTW:

Mit jaPBe greift die methode auch nicht.

Verfasst: 01.09.2005 19:27
von ts-soft
Nein, weil CurrentDir von dem PBCompiler gesetzt wird, mit SetCurrentDirectory_(@Dir). Da kommt niemand mehr zwischen :wink:

Verfasst: 01.09.2005 19:41
von al90
Ein kleines beispiel:

Code: Alles auswählen

dir$="C:\Windows\"
SetCurrentDirectory_(@dir$)
a$=Space(#MAX_PATH)
x=GetCurrentDirectory_(#MAX_PATH,@a$)

Debug a$
Und wenn ich nun ein File aus dem selben (App)Dir laden möchte und
dieses (was ja niemals ausgeschlossen werden kann) mit /Compilers
endet, haben wir ein problem. :mrgreen:

Verfasst: 01.09.2005 22:28
von rolaf
ts-soft hat geschrieben:Hier mal meine Version, aus meiner Bausteinsammlung. Unterschied ist folgender: Es wird auch in der IDE der richtige Pfad ermittelt, wichtig für INI-Dateien usw.
...
Also beim Compilieren in der IDE wird einfach geschummelt, da die IDE autom. CurrentDirectory setzt. :wink:
Ja, das ist es was ich gut brauchen kann. Klasse! :allright:

Verfasst: 02.09.2005 09:22
von Shardik
Eine weitere Möglichkeit, den Start aus der Entwicklungsumgebung zu erkennen, besteht darin zu testen, ob der mit GetModuleFileName_() ermittelte Dateiname mit "PureBasic" beginnt:

Code: Alles auswählen

HomeDirPath.S = Space(256)

If GetModuleFileName_(0, @HomeDirPath, Len(HomeDirPath)) = #False
  MessageRequester("Fehler", "Ermittlung des Applikationsverzeichnisses mit GetModuleFileName_() fehlgeschlagen!")
Else
  If UCase(Left(GetFilePart(HomeDirPath), 9)) = "PUREBASIC"
    HomeDirPath = Space(256)

    If GetCurrentDirectory_(Len(HomeDirPath), @HomeDirPath) = #False
      MessageRequester("Fehler", "Ermittlung des Applikationsverzeichnisses mit GetCurrentDirectory_() fehlgeschlagen!")
      End
    EndIf
  Else
    HomeDirPath = GetPathPart(HomeDirPath)
    HomeDirPath = Left(HomeDirPath, Len(HomeDirPath) - 1)
  EndIf

  MessageRequester("Info", "Applikationsverzeichnis: " + HomeDirPath)
EndIf
Kopiert man dieses Programm in den IDE-Editor und startet es, erscheint als Applikationspfad "C:\Programme\PureBasic" (bzw. der Installationspfad von PureBASIC). Speichert man das Programm in der IDE in einem beliebigen Verzeichnis ab, erscheint nach dem Start genau dieser Pfadname. Kompiliert man dieses Programm zu einer Exe-Datei und startet die Exe-Datei (z.B. durch Doppelklick im Explorer), erscheint ebenfalls der Name des Verzeichnisses, in dem die Exe-Datei gespeichert wurde.

Verfasst: 02.09.2005 10:06
von MARTIN
Ok. Ich mülle euch auch ein bißchen mit Api aufrufen zu und poste das gleiche aber für Linux:

Code: Alles auswählen

DefType.s directory
directory = Space(256) 

;*******************************************
  getcwd_(directory,Len(directory)+1);
;*******************************************
Debug directory

End
Diese Dinge sind leider nicht Plattformübergreifend, deshalb also nur per API möglich.
Die ganzen GUI-Sahen sind auch nur per API möglich dennnoch sind sie auf allen Platformen vorhanden, es hat sich halt bislang noch keiner die Mühe gemacht so was wie GetAppDirectory() zu schreiben, obwohl es eine Kleinigkeit wäre.

Verfasst: 08.09.2005 02:48
von ts-soft
@Martin
Diese Version ist aber einfacher:

Code: Alles auswählen

directory.s = PeekS(get_current_dir_name_())
Debug directory