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.
Antworten
Benutzeravatar
DonLucio
Beiträge: 950
Registriert: So 29. Dez 2013, 01:14
Wohnort: Hamburg
Kontaktdaten:

Programm starten über seine Schablone - wie geht das?

Beitrag von 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: Alles auswählen

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.
Benutzeravatar
aschn
Beiträge: 1363
Registriert: Mi 25. Dez 2013, 22:47

Beitrag von aschn »

DonLucio hat geschrieben: Sa 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
Benutzeravatar
DonLucio
Beiträge: 950
Registriert: So 29. Dez 2013, 01:14
Wohnort: Hamburg
Kontaktdaten:

Beitrag von DonLucio »

aschn hat geschrieben: Sa 27. Aug 2022, 18:04
DonLucio hat geschrieben: Sa 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.
Benutzeravatar
aschn
Beiträge: 1363
Registriert: Mi 25. Dez 2013, 22:47

Beitrag von aschn »

DonLucio hat geschrieben: Sa 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
Benutzeravatar
DonLucio
Beiträge: 950
Registriert: So 29. Dez 2013, 01:14
Wohnort: Hamburg
Kontaktdaten:

Beitrag von DonLucio »

aschn hat geschrieben: Sa 27. Aug 2022, 21:14
DonLucio hat geschrieben: Sa 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.
Benutzeravatar
LotharS
Beiträge: 968
Registriert: So 29. Dez 2013, 20:07
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag von LotharS »

DonLucio hat geschrieben: Sa 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!
Benutzeravatar
aschn
Beiträge: 1363
Registriert: Mi 25. Dez 2013, 22:47

Beitrag von 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
Antworten