Programm-Verzeichnis ermitteln

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benubi
Beiträge: 187
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Programm-Verzeichnis ermitteln

Beitrag von Benubi »

Hallo allerseits,

ich habe ein Problem mit meinem Executable und Unterverzeichnissen (glaube ich)... wenn ich meine exe starte, passiert nichts... vielleicht weil bei Add3DArchive("mesh") das Verzeichnis nicht gefunden wurde ?

Aus dem Interpreter heraus gestatert, läuft es wunderbar!

Bei mir sieht die Verzeichnisstruktur derzeit so aus:

+Mesh (Dir)
Meshtest.pb
Meshtest.exe


Frage:

Wie kann ich das Verzeichnis ermitteln, in dem das gestartete Programm gespeichert ist ?
Bei C++ steht es ja oft im ProgrammParameter 0 [Programmaufruf-string].

Gibt es einen "Dir()" Befehl, der mir das aktuelle Verzeichnis zurrückgibt ?

ist sicherlich ganz einfach, aber ich habe es noch nicht hinbekommen :oops:
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Das aktuelle Verzeichniss kann mensch in der Demoversion mit dieser Funktion ermitteln:

Code: Alles auswählen

Procedure.s GetCurrentDirectory()
    DefType.l FolderAdr, FunkCTO
    
    *FolderAdr = AllocateMemory(255)
    OpenLibrary(0, "kernel32.dll") 
    *FunkCTO = IsFunction(0, "GetCurrentDirectoryA")
    CallFunctionFast(*FunkCTO, 255, *FolderAdr) 
    CloseLibrary(0)    
    
    ProcedureReturn PeekS(*FolderAdr,255)
EndProcedure
Bild
Benubi
Beiträge: 187
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Beitrag von Benubi »

LittleFurz hat geschrieben:Das aktuelle Verzeichniss kann mensch in der Demoversion mit dieser Funktion ermitteln:

Code: Alles auswählen

Procedure.s GetCurrentDirectory()
    DefType.l FolderAdr, FunkCTO
    
    *FolderAdr = AllocateMemory(255)
    OpenLibrary(0, "kernel32.dll") 
    *FunkCTO = IsFunction(0, "GetCurrentDirectoryA")
    CallFunctionFast(*FunkCTO, 255, *FolderAdr) 
    CloseLibrary(0)    
    
    ProcedureReturn PeekS(*FolderAdr,255)
EndProcedure

Hi und danke für die schnelle antwort. ich habe meine demo-lition phase seit heute hinter mir <) ... ich nehme an es geht auch in der vollversion...

allerdings, und sei mir bitte nicht böse wenn ich das so direkt sagen muss:
das ist ein windows-abhängige funktion...

ich werde es aber vorübergehend benutzen.... danke!

meinst du dass man sowas dem entwickler-team vorschlagen sollte ??

Eine solche Funktion gehört doch eigentlich zum Basic-Standard, oder irre ich mich ? :?

mfG

Benubi
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Frag mich nicht. in VB ermittelt man den Programmpfad mit APP.Path.
Wie man sowas mit Linux realisiert, hab ich keine Ahnung. In der Vollversion geht das ganze natürlich einfacher ;)

Code: Alles auswählen

ProgrammPfad.s = Space(255)
GetCurrentDirectory_(255, @ProgrammPfad)
Zuerst Erstelle ich eine Variable und schreibe 255 mal ein Leerzeichen rein. Damit schaffe ich Platz, für die Funktion, die den Pfad in die Variable kopiert. Danach rufe ich die Funktion [c]GetCurrentDirectory_[/c] auf und übergebe die Größe und die Adresse der Variable [c]ProgrammPfad[/c]. Die Adresse einer Variable kann man immer mit einem @ vor dem Variablenamen ermitteln. Das funktioniert übrigens auch mit Funktionen ;)
Bild
Benubi
Beiträge: 187
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Beitrag von Benubi »

LittleFurz hat geschrieben:Frag mich nicht. in VB ermittelt man den Programmpfad mit APP.Path.
jau. es gibt aber einen basic-standardbefehl, bei fast allen basic-sprachen, der lautet "Dir()" oder "Dir$()" o.Ä.
(bei VB übrigens auch. App.Path gibt hier den Programmpfad zurrück, nicht das aktuelle... bei meinem problem wäre das aber beides gleich)...
Wie man sowas mit Linux realisiert, hab ich keine Ahnung. In der Vollversion geht das ganze natürlich einfacher ;)
:)

Code: Alles auswählen

ProgrammPfad.s = Space(255)
GetCurrentDirectory_(255, @ProgrammPfad)
Space(255)... *gg* windows... :lol:

danke für die tipps... das mit den zeigern ist übrigens ein grund, weshalb ich eurer "religiösen bewegung" beigetreten bin... habe mit pb schon viel rumgezeigt
:allright:

bis denne,

Benubi
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Benubi hat geschrieben:meinst du dass man sowas dem entwickler-team vorschlagen sollte ??
:? kann man eine Person als Team bezeichnen? :lol: Fred ist unser Gott, merk dir das.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

muss Fred vergöttern... :praise:
Bild
Benubi
Beiträge: 187
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Beitrag von Benubi »

Brüder und Schwestern, heute ist der Tag gekommen, an dem ich feststelen muss, dass wir alle im Glauben vereint sind <)
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag von helpy »

Hab zwar die Smilies gesehen, ...
DarkDragon hat geschrieben:Fred ist unser Gott, merk dir das.
... aber ich hab' trozdem was gegen "Vergötterung" ... auch wenn's nur zum Spass ist.
Benubi hat geschrieben:Brüder und Schwestern, heute ist der Tag gekommen, an dem ich feststelen muss, dass wir alle im Glauben vereint sind <)
Es gibt bessere Grundlagen für Einheit!

cu, helpy
Benutzeravatar
wichtel
Beiträge: 150
Registriert: 09.09.2004 08:35
Wohnort: Hattersheim

Beitrag von wichtel »

Bruder, in linux geht das so:

Code: Alles auswählen

Procedure.s GetEnv(Variable$) 
    Protected *Environ.LONG 

    !extrn _environ 
    !MOV eax, [_environ] 
    !MOV [esp+4], eax 

    Variable$ + "=" 

    While *Environ\l <> 0 
      If CompareMemoryString(@Variable$, *Environ\l, 0, Len(Variable$)) = 0 
        ProcedureReturn PeekS(*Environ\l + Len(Variable$)) 
      EndIf 
      *Environ + 4 
    Wend 

    ProcedureReturn "" 
  CompilerEndIf 

EndProcedure 

OpenConsole()

PrintN("machwas")
PrintN( GetEnv("PWD"))
CloseConsole()

(nicht von mir)
PB / jaPBe jeweils aktuellste Version, seit 3.62 dabei, XP sp3 de/en & W7 en
Antworten