Rexx-Problem: Eigenes Dir ermitteln

(DE) System, Installation, Konfiguration, Hardware, Treiber, Netzwerk, Virtualisierung, etc.
(EN) System, Installation, Configuration, Hardware, Drivers, Network, Virtualisation, etc.
User avatar
DonLucio
Posts: 658
Joined: Sun 29. Dec 2013, 01:14
Location: Hamburg

Rexx-Problem: Eigenes Dir ermitteln

Post by 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: Select all

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
Posts: 440
Joined: Mon 4. Jan 2016, 14:36

Post by erdmann »

Im Zweifelsfall mit "@cd | RXQUEUE". Aber "directory()" sollte meine ich auch den aktuellen Pfad liefern.

aschn
Posts: 1157
Joined: Wed 25. Dec 2013, 22:47

Post by aschn »

Ich sehe gerade, Du meinst VXREXX-Programme.

Normal, für andere Umgebungen, nimmst Du:

Code: Select all

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

User avatar
DonLucio
Posts: 658
Joined: Sun 29. Dec 2013, 01:14
Location: Hamburg

Post by DonLucio »

erdmann wrote:
Tue 2. Mar 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.

aschn
Posts: 1157
Joined: Wed 25. Dec 2013, 22:47

Post by aschn »

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

Code: Select all

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

Sieht gut aus, aber ungetestet.
Andreas Schnellbacher

User avatar
DonLucio
Posts: 658
Joined: Sun 29. Dec 2013, 01:14
Location: Hamburg

Post by 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 wrote:
Tue 2. Mar 2021, 17:28
wobei 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.

aschn
Posts: 1157
Joined: Wed 25. Dec 2013, 22:47

Post by aschn »

DonLucio wrote:
Tue 2. Mar 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

User avatar
DonLucio
Posts: 658
Joined: Sun 29. Dec 2013, 01:14
Location: Hamburg

Post by DonLucio »

aschn wrote:
Tue 2. Mar 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.

aschn
Posts: 1157
Joined: Wed 25. Dec 2013, 22:47

Post by aschn »

DonLucio wrote:
Wed 3. Mar 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

User avatar
DonLucio
Posts: 658
Joined: Sun 29. Dec 2013, 01:14
Location: Hamburg

Post by DonLucio »

aschn wrote:
Wed 3. Mar 2021, 08:08
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.
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.

aschn
Posts: 1157
Joined: Wed 25. Dec 2013, 22:47

Post by aschn »

DonLucio wrote:
Wed 3. Mar 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

User avatar
DonLucio
Posts: 658
Joined: Sun 29. Dec 2013, 01:14
Location: Hamburg

Post by DonLucio »

aschn wrote:
Wed 3. Mar 2021, 14:39
In RXU wäre das: RxGetInfoBlocks mit .P.3, danach RxQueryModuleName.
Hat super geklappt!

Danke!

Don Lucio.