Programm starten über seine Schablone - wie geht das?

(DE) Anwendungen für Office, Multimedia und Spiele, Werkzeuge, Hilfsprogramme, etc
(EN) Applications for Office, Multimedia or Games, Tools, Utilities, e.g.
User avatar
DonLucio
Posts: 776
Joined: Sun 29. Dec 2013, 01:14
Location: Hamburg

Programm starten über seine Schablone - wie geht das?

Post by DonLucio »

Ich versuche, aus einem Rexx-Programm heraus ein leeres Spreadsheet (aus IBMWorks) zu starten. Dazu bin ich auf die Idee verfallen, das Template-Objekt für IBMWorks-Spreadsheets zu öffnen (bei mir unter C:\Desktop\Computer\Templates\FPWorks SS.LSS).

Das funktioniert im Prinzip auch. Ich habe mir das Schablonen-Objekt sicherheitshalber kopiert in mein Arbeitsverzeichnis e:\Rexxe, unter einem neuen Namen "EmptySheet.LSS".

In meinem Rexx-Programm verwende ich diesen Befehl:

Code: Select all

Obj = "e:\Rexxe\EmptySheet.LSS";
ok = SysOpenObject( Obj, "DEFAULT", "FALSE" );
Das leere Spreadsheet öffnet sich, ich kann darin arbeiten. Das Problem dabei ist: Wenn ich das Spreadsheet schließe, egal ob modifiziert oder nicht, geht mein ganzer Prozess flöten. Will sagen: Mein aufrufendes Rexx-Programm wird zwangsbeendet.

Ich ging davon aus, dass die SysOpenObject()-Funktion ähnlich wie ein "Call" funktioniert, also das Objekt synchron aufgerufen wird. Vielmehr sieht es so aus, als ob ein neuer Prozess gestartet wird, der die vollständige Kontrolle über mein Rexx-Programm erhält. Mit der häßlichen Folge, dass der startende Prozess (mein Rexx-Programm) automatisch mit beendet wird, wenn das gestartete Objekt endet.

Leider fehlt mir ein tiefergehendes Verständnis der OS/2-eigenen Object-Technologie, sodass ich an der Stelle nicht weiterkomme.

Gibt's da vielleicht irgendwelche (undokumentierten) Parameter im SysOpenObject(), die das Problem aus der Welt schaffen?

Danke,
Lutz W.

User avatar
aschn
Posts: 1355
Joined: Wed 25. Dec 2013, 22:47

Post by aschn »

DonLucio wrote:
Sat 27. Aug 2022, 17:55
Ich ging davon aus, dass die SysOpenObject()-Funktion ähnlich wie ein "Call" funktioniert, also das Objekt synchron aufgerufen wird.
SysOpenObject oder SysSetObjectData funktionieren asynchron, also wie der OS/2-Befehl "start". Zum synchronen Starten brauchst Du unter anderem eine Queue (nur so als Hinweis). Vielleicht bietet RXU ja so etwas.

... Ja: RxExecPgm aus dem RXU-Paket.

Nebenbei: Mit Schablonen hat das nichts zu tun. Kann sein, dass das nur mit DnD geht. Macht ja aber nichts.
Andreas Schnellbacher

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

Post by DonLucio »

aschn wrote:
Sat 27. Aug 2022, 18:04
DonLucio wrote:
Sat 27. Aug 2022, 17:55
Ich ging davon aus, dass die SysOpenObject()-Funktion ähnlich wie ein "Call" funktioniert, also das Objekt synchron aufgerufen wird.
SysOpenObject oder SysSetObjectData funktionieren asynchron, also wie der OS/2-Befehl "start". Zum synchronen Starten brauchst Du unter anderem eine Queue (nur so als Hinweis). Vielleicht bietet RXU ja so etwas.

... Ja: RxExecPgm aus dem RXU-Paket.

Nebenbei: Mit Schablonen hat das nichts zu tun. Kann sein, dass das nur mit DnD geht. Macht ja aber nichts.
Danke.
Ok, muß ich halt mit leben, dass das Ganze asynchron abläuft. Mit Queues müßte das lösbar sein (RXU habe ich noch irgendwo rumstehen).

Das andere Problem, dass sich mein Hauptprozess "zwangsbeendet", hat sich inzwischen geklärt: Ich habe da eine Funktion aus dem RxExtras-Paket drin. Und die macht, dass sich der Prozess sang- und klanglos verabschiedet. Das ist überingens nicht mein erster Ärger, den ich mit RxExtras habe. Also besser Finger weg von dem Paket.

Gruß,
Lutz W.

User avatar
aschn
Posts: 1355
Joined: Wed 25. Dec 2013, 22:47

Post by aschn »

DonLucio wrote:
Sat 27. Aug 2022, 18:21
Mit Queues müßte das lösbar sein
Nein, so hab ich das nicht gemeint. DosStartSession bietet mehr Optionen als DosExecPgm. Während man für DosExecPgm einen Parameter zum synchronen Starten hat, geht das mit DosStartSession mit einer Queue. Du brauchst also für RxExecPgm keine extra Queue.
Andreas Schnellbacher

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

Post by DonLucio »

aschn wrote:
Sat 27. Aug 2022, 21:14
DonLucio wrote:
Sat 27. Aug 2022, 18:21
Mit Queues müßte das lösbar sein
Nein, so hab ich das nicht gemeint. DosStartSession bietet mehr Optionen als DosExecPgm. Während man für DosExecPgm einen Parameter zum synchronen Starten hat, geht das mit DosStartSession mit einer Queue. Du brauchst also für RxExecPgm keine extra Queue.
Das ist wohl richtig. Jedoch nützt mir DosExecPgm (aka RxExecPgm) nichts, weil damit läßt sich das Template nicht öffnen. Das geht (afaik) nur mit SysOpenObject.

Das Sync-Problem konnte ich mit einer Semaphore lösen. Da ich mich ja in einer Singleuser-Umgebung bewege, bietet sich das Clipboard als einfachste Semaphore an.

Problem gelöst :-)

Danke.
Lutz W.

User avatar
LotharS
Posts: 855
Joined: Sun 29. Dec 2013, 20:07
Location: Düsseldorf

Post by LotharS »

DonLucio wrote:
Sat 27. Aug 2022, 17:55
In meinem Rexx-Programm verwende ich diesen Befehl:... SysOpenObject() ...
Hab ich in Rexx eigentlich genauso gelöst, z.B. wenn ich zu einer bekannten Extension die Anwendung öffnen will.
Alternativ etwa per "address CMD '@||'anwendung datei ..." gestartet, gfs. mit 'CMD /C' oder sogar 'CMD /C detach" (letzteres aus C++). SysOut/Err noch nach NUL, xxx.txt oder RxQueue umleiten je nachdem.
IBMWorks hab ich allerdings ewig nicht mehr gebraucht dank OO....
Viel Erfolg!

User avatar
aschn
Posts: 1355
Joined: Wed 25. Dec 2013, 22:47

Post by aschn »

Wenn da was an der WPS vorbei ausgeführt wird, hat das gar nichts mit Schablonen zu tun.

Ein Programm in CMD aufgrufen wird synchron (also wie mit CALL davor) ausgeführt. Darum geht es. Wenn man aber eine Datei mit dem zugeordneten Programm starten will, kann man die Zuordnung aus der OS2.INI lesen und dann mühevoll den Befehl zusammensetzen. Das geht in REXX mit SysOpenObject oder SysSetObjectData einfacher (WinOpenObject/WinSetObjectData). An der Schabloneneigenschaft ist aber auch das vorbei.
Andreas Schnellbacher