Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

buers
Junior Member
Beiträge: 26
Registriert: 18 Mär 2021, 10:32

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von buers »

Danke dir für die ausführliche Antwort. Ich schaue mir das nochmals genauer an, bin aber grade etwas knapp mit der Zeit dafür. Melde mich nochmals dazu und teste das auch Mal mit deinen Programmen.
buers
Junior Member
Beiträge: 26
Registriert: 18 Mär 2021, 10:32

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von buers »

So, habe das nochmals getestet und geprüft - jetzt auch mit tvb 4.2.3. Ich komme zurecht und kriege hin, was ich will. Dennoch paar Kommentare. Zuerst: Du hattest etwas andere Ergebnisse in deinen Tests, wie man ein externes Programm aufrufen muss, als ich. Ich denke, ich habe den Grund gefunden. Für mich war eigentlich die Referenz, ein kompiliertes C oder C++ Programm mit Standard Windows Tools. Jetzt musste ich feststellen: Es macht einen Unterschied ob ich den Microsoft C++ Compiler nehme oder Gcc. Offenbar ist der Startup-Code (der immer dazu gelinkt wird, und der die C++ main bzw. Windows-typisches wmain aufruft) in beiden unterschiedlich implementiert. Der entscheidenden Unterschied bei Aufruf über Programm/Windows API (nicht über cmd.exe):

Aufrufparameter: "a """b""" c" -> funktioniert mit MSC und Gcc, Programm erhält ein Argument: a "b" c
Aufrufparameter: "a ""b"" c" -> funktioniert mit MSC Programm erhält ein Argument: a "b" c, funktioniert nicht mit Gcc. Programm erhält zwei Argumente.

Hat gedauert, bis ich das begriffen hatte ... Wie bemerkt, der Unterschied liegt im aufgerufenen Programm.

Zu TVB 4.2.3 - hatten wir schon andiskutiert: Bei Username: Computer\User muss man jetzt den Backslash verdoppeln (jedenfalls unter WIndows, wenn das aufrufende Programm ein Executable ist - bei /bin/sh braucht man vielleicht 4, aber da wird man typischerweise keinen Backslash im Usernamen haben), in 4.2.2 nicht. In der Diskussion oben nanntest du, man müsse den Backslash vervierfachen. Ich vermute, dass über diese Änderung viele Windows-User stolpern werden (viele von denen, die das Feature verwenden).

Für mich ist das damit grundsätzlich abgeschlossen, da ich alles hinkriege, wie ich es brauche. Dennoch paar Anmerkungen, vielleicht Inspiration, wie man das Interface besser machen könnte.

Es gibt keine leichte Verlässlichkeit, das wievielte Argument welchen Inhalt hat. Konstruiertes Beispiel: "{episode}" "{url}". url sei nicht leer. Je nachdem, ob episode leer ist oder nicht, wird url als erstes oder als zweites Argument übergeben. Der aufgerufene Prozess kann nur raten. (Ich nutze Workaround - noch ein Leerzeichen dazu packen zwischen die Quotes. Erwartet hätte ich, dass ein leeres Argument übergeben wird ohne den Workaround.

Wenn man clean() benutzt ist alles einfach. Ist aber für sowas wie description ungeeignet, besonders in der deutschen Sprache. Man kann sich fragen, ob jemals jemand {description} haben möchte, und das empfangende Programm (sei es ein kompiliertes Executable oder ein .cmd oder) will das in einzelne Wörter auseinandergebrochen. Meines Erachtens wäre es naheliegender, das per default als ein Argument zu übergeben. (Und für sehr spezielle Ausnahmefälle eine Funktion wie break_into_words(description) zu nutzen. Und meines Erachtens sollte dann der aufrufende Code halt auch transparent alles tun, um da Quotes oder jedes andere Zeichen innerhalb der description korrekt zu übergeben (ohne dass man zu escapequotes oder replace greift - ich kann mir schwer vorstellen, dass jemand description oder andere Textfelder sinnvoll nutzen kann, ohne replace/escapequotes/clean. Ich nehme an, neben Quotes sind primär Backslashes problematisch. Bei Skripten braucht man unter Windows wohl noch replaceNewline(), bei exes habe ich da kein Problem. Mein Beispiel von dem unterschiedlich implementierten Startup-Code macht das Ganze allerdings schwierig, aber immerhin \" und """ funktionierten verlässlich in allen meinen getesteten Varianten, "" leider nicht.

Zu den Variablen: Meines Erachtens wirklich nicht intuitiv, dass man da Backslash verdoppeln muss. Hier bin ich ja wirklich an einer User-Schnittstelle. Dass man in Programmcode auf Backslash aufpassen muss ist klar. Aber in einer Maske (die nicht explizit Code verlangt) eines Programms - das ist wirklich überraschend. (Keine Frage, ist der Passwort-Übergabe-Mechanismus in Klartext von vorne herein fragwürdig. In einer typischen kontrollierten Heim-Umgebung aber für mich schon noch ok)

Nochmals: Danke für die Unterstützung!
ds10
Site Admin
Beiträge: 19095
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von ds10 »

Das Problem ist einfach historisch begründet. Der Fehler war letztendlich die Parametereingabe als Freitext zu gestalten, dadurch hat man keine Möglichkeit zu wissen, was als ein Parameter aufzufassen ist, weshalb dann mit Anführungszeichen gearbeitet werden muss, was dann wiederum zu doppelten Escape-Sequenzen führt.

Würde für jeden Parameter genau eine Zeile verwendet, gäbe es gar kein Problem.

Für leere Parameter gibt es die Funktion {isset()}, damit kann man z.B. {isset(url,"no-url")} festlegen und der Parameter taucht an der korrekten Stelle auf.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
buers
Junior Member
Beiträge: 26
Registriert: 18 Mär 2021, 10:32

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von buers »

Ja, das kann ich mir schon gut vorstellen, wie sowas gewachsen ist ...
Ich nehme an: "Würde für jeden Parameter genau eine Zeile verwendet, gäbe es gar keine Problem." ist hypothetisch gemeint, in der Art: Wenn man das von Anfang an so designed hätte und nicht in der Art: "wenn du für jeden Parameter eine Zeile nehmen würdest".

Das mit den leeren Parameter habe ich schon hingekriegt. War nur als Hinweis, dass da vielleicht noch ein Fehler verborgen ist. Ich hätte auf Anhieb erwartet, dass das aufgerufene Programm bei

Code: Alles auswählen

"{ParameterLeer}" "{ParameterMitInhaltHugo}"
aufgerufen wird mit

Code: Alles auswählen

irgendwas.exe "" "Hugo" 
Dann sieht das Programm als ersten Parameter den Leerstring. Aber mit dem ganzen Quoting/Escaping bin ich jetzt vielleicht durcheinander gekommen.
ds10
Site Admin
Beiträge: 19095
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von ds10 »

buers hat geschrieben: 17 Mai 2021, 12:42 Ja, das kann ich mir schon gut vorstellen, wie sowas gewachsen ist ...
Ich nehme an: "Würde für jeden Parameter genau eine Zeile verwendet, gäbe es gar keine Problem." ist hypothetisch gemeint, in der Art: Wenn man das von Anfang an so designed hätte und nicht in der Art: "wenn du für jeden Parameter eine Zeile nehmen würdest".
Ja, ist hypothetisch gemeint.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Antworten