Rexx-Problem: Eigenes Dir ermitteln

(DE) System, Installation, Konfiguration, Hardware, Treiber, Netzwerk, Virtualisierung, etc.
(EN) System, Installation, Configuration, Hardware, Drivers, Network, Virtualisation, etc.
Antworten
Benutzeravatar
DonLucio
Beiträge: 954
Registriert: So 29. Dez 2013, 01:14
Wohnort: Hamburg
Kontaktdaten:

Rexx-Problem: Eigenes Dir ermitteln

Beitrag von DonLucio »

Problem: Ich möchte in einem Rexx-Programm wissen, aus welchem Verzeichnis es aufgerufen wurde.

Lt. Rexx-Programmierhandbuch liefert der PARSE SOURCE-Befehl diese Information:

Code: Alles auswählen

parse source . . HomePath;
In dem erwähnten Manual ist zu lesen:
"... followed by the complete path specification of the program file."

Das funktioniert bei cmd-Programmen, sowie auch bei mit rexx2exe "compiliierten" Programmen. Leider nicht bei VXRexx-Programmen, dort wird nur "<Programmname>.VRM" geliefert. Ohne Directory-Information.

Gibt's nicht irgendeinen System-Call, um den HomePath herauszukriegen?

Danke,
Don Lucio.
erdmann
Beiträge: 594
Registriert: Mo 4. Jan 2016, 14:36

Beitrag von erdmann »

Im Zweifelsfall mit "@cd | RXQUEUE". Aber "directory()" sollte meine ich auch den aktuellen Pfad liefern.
Benutzeravatar
aschn
Beiträge: 1363
Registriert: Mi 25. Dez 2013, 22:47

Beitrag von aschn »

Ich sehe gerade, Du meinst VXREXX-Programme.

Normal, für andere Umgebungen, nimmst Du:

Code: Alles auswählen

PARSE SOURCE . . ThisFile
lp = LASTPOS( '\', ThisFile)
ThisDir = LEFT( ThisFile, lp - 1)
wobei ThisFile wirklich die aktuelle Datei und kein Verzeichnis ist. HomePath ist dabei irreführend.

Das wird dann ein Fehler in VXREXX sein. Wenn es Dir darum geht andere Dateien, wie z.B. Hilfedateien im selben Verzeichnis zu finden, dann sollte Lars' Methode ausreichen. Das ist natürlich nur dann sicher, wenn Du nicht in ein anderes Verzeichnis wechselst oder ein anderes Arbeitsverzeichnis eingestellt ist. Sonst sehe ich keine Möglichkeit. In C gäbe es DosGetInfoBlocks.
Andreas Schnellbacher
Benutzeravatar
DonLucio
Beiträge: 954
Registriert: So 29. Dez 2013, 01:14
Wohnort: Hamburg
Kontaktdaten:

Beitrag von DonLucio »

erdmann hat geschrieben: Di 2. Mär 2021, 16:36 Im Zweifelsfall mit "@cd | RXQUEUE". Aber "directory()" sollte meine ich auch den aktuellen Pfad liefern.
directory() liefert den Pfad, von wo aus mein Programm aufgerufen wird. Ich suche den Pfad, in dem mein exe liegt.

Sorry für meine mißverständliche Darstellung.
Benutzeravatar
aschn
Beiträge: 1363
Registriert: Mi 25. Dez 2013, 22:47

Beitrag von aschn »

Ich hab gerade gefunden, dass RXU von Dave Boll RxGetInfoBlocks hat:

Code: Alles auswählen

start view rxu RxGetInfoBlocks
wenn rxu.inf in BOOKSHELF ist.

Sieht gut aus, aber ungetestet.
Andreas Schnellbacher
Benutzeravatar
DonLucio
Beiträge: 954
Registriert: So 29. Dez 2013, 01:14
Wohnort: Hamburg
Kontaktdaten:

Beitrag von DonLucio »

@aschn:
"wenn rxu.inf in BOOKSHELF ist." Oh .. da haben sich unsere beiden Posts gerade überschnitten :-)

Danke! Das ist, was ich suche!

Das ist demnach jetzt veraltet:
aschn hat geschrieben: Di 2. Mär 2021, 17:28wobei ThisFile wirklich die aktuelle Datei und kein Verzeichnis ist. HomePath ist dabei irreführend.
Stimmt, ist irreführend.
Ich hab's nur so genannt, weil es das ist, was ich suche und mit filespec() der HomePath sehr einfach herauszuschneiden ist (oder auch mit der von dir dargestellten Methode (Lastpos)).

Ich glaube auch, dass es eine Macke in VXRexx ist. Deshalb suche ich auch nach einem Workaround ausserhalb der Rexx-Welt. Dein Tip mit "DosGetInfoBlocks" könnte ein Weg sein. Ich meine, es gibt da so Rexx-Bibliotheken (FileRexx o.a.), die sehr viele Systemfunktionen für die Rexx-Welt verfügbar machen (für Leute wie mich, die kein C können...).

Da werde ich mal suchen.

Danke einstweilen.

Don Lucio.
Benutzeravatar
aschn
Beiträge: 1363
Registriert: Mi 25. Dez 2013, 22:47

Beitrag von aschn »

DonLucio hat geschrieben: Di 2. Mär 2021, 19:22 directory() liefert den Pfad, von wo aus mein Programm aufgerufen wird.
Nebenbai: Z.B. bei den Mozillen musst Du auch das Arbeitsverzeichnis setzen, damit die restlichen Dateien gefunden werden.

Das wäre also bei PM-Programmen (nur bei diesen?) normales Verhalten, es sei denn, diese Programme benutzen explizit DosGetInfoBlocks.
Andreas Schnellbacher
Benutzeravatar
DonLucio
Beiträge: 954
Registriert: So 29. Dez 2013, 01:14
Wohnort: Hamburg
Kontaktdaten:

Beitrag von DonLucio »

aschn hat geschrieben: Di 2. Mär 2021, 19:38... es sei denn, diese Programme benutzen explizit DosGetInfoBlocks.
Hmm ... es muß noch ein anderes "Geheimnis" geben: Ich mußte leider inzwischen feststellen, dass DosGetInfoBlocks nicht die gesuchte Information liefert (jedenfalls nicht die rxu-Implementation).

Vielleicht führt der Weg über den "Exe-module-handle", vielleicht kommt man über den an den Home-Path des aufgerufenen Programms. Aber weiterführende Info wird im rxu.inf nicht gegeben.

Muß man da wirklich so tief in die OS/2 Programmer's Reference einsteigen?

Gruß
Don Lucio.
Benutzeravatar
aschn
Beiträge: 1363
Registriert: Mi 25. Dez 2013, 22:47

Beitrag von aschn »

DonLucio hat geschrieben: Mi 3. Mär 2021, 00:00 Ich mußte leider inzwischen feststellen, dass DosGetInfoBlocks nicht die gesuchte Information liefert (jedenfalls nicht die rxu-Implementation).
Du meintest RxGetInfoBlocks aus RXU innerhalb einer VXREXX-Anwendung. Was hast Du wie ausgeführt? (.P.4) sieht richtig aus. Ganz unten in der Hilfe steht, dass Du die Adresse mit RxStorage() in einen Wert umwandeln kannst.
Andreas Schnellbacher
Benutzeravatar
DonLucio
Beiträge: 954
Registriert: So 29. Dez 2013, 01:14
Wohnort: Hamburg
Kontaktdaten:

Beitrag von DonLucio »

aschn hat geschrieben: Mi 3. Mär 2021, 08:08Du meintest RxGetInfoBlocks aus RXU innerhalb einer VXREXX-Anwendung. Was hast Du wie ausgeführt? (.P.4) sieht richtig aus. Ganz unten in der Hilfe steht, dass Du die Adresse mit RxStorage() in einen Wert umwandeln kannst.
Genau das habe ich gemacht. Als Ergebnis von P.4 sehe ich nur die Commandline, wie das Programm aufgerufen wurde. Mit allen Parametern, aber ohne Path-Info.

P.5 zeigt nur Inhalte zum Environment, also aus der Config.sys. Da hätte ich mir den Pfad, wo das aufgerufene Programm liegt, vorstellen können. Ist aber leider nicht.

Aber P.4 (Commandline) liefert immerhin dann den Path mit, wenn der Programmaufruf mit vollständiger Pfadangabe passiert. Das Problem besteht insofern nur dann, wenn das aufgerufene Programm irgendwo im PATH liegt und aufgerufen werden kann, ohne sein Home-Directory mit anzugeben.

Damit kann ich leben :-)

Trotzdem finde ich es seltsam, dass das OS/2-API offenbar keine Möglichkeit bietet, den Home-Path eines aufgerufenen Programmes herauszufinden.

Egal. Du hast mir mit dem RxGetInfoBlocks() sehr geholfen, danke!

Don Lucio.
Benutzeravatar
aschn
Beiträge: 1363
Registriert: Mi 25. Dez 2013, 22:47

Beitrag von aschn »

DonLucio hat geschrieben: Mi 3. Mär 2021, 13:05 Als Ergebnis von P.4 sehe ich nur die Commandline, wie das Programm aufgerufen wurde. Mit allen Parametern, aber ohne Path-Info.
OK, ich hab gerade mal nachgesehen, wie das in C gemacht wird. Doch etwas anders: DosGetInfoBlocks war aber schon richtig. Das ergibt das Handle der .exe-Datei. Damit erhält man dann mit DosQueryModuleName den vollständigen Pfadnamen.

In RXU wäre das: RxGetInfoBlocks mit .P.3, danach RxQueryModuleName. Normal geht DosQueryModuleName nicht nur mit .dll- sondern auch mit .exe-Dateien.
Andreas Schnellbacher
Benutzeravatar
DonLucio
Beiträge: 954
Registriert: So 29. Dez 2013, 01:14
Wohnort: Hamburg
Kontaktdaten:

Beitrag von DonLucio »

aschn hat geschrieben: Mi 3. Mär 2021, 14:39 In RXU wäre das: RxGetInfoBlocks mit .P.3, danach RxQueryModuleName.
Hat super geklappt!

Danke!

Don Lucio.
Antworten