Basic: exe-File aus Dokument-Container heraus starten?

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

craig22
****
Beiträge: 107
Registriert: Mi, 19.08.2020 13:47

Basic: exe-File aus Dokument-Container heraus starten?

Beitrag von craig22 »

Hallo,

in Anlehnung an den Pit’s Thread „Screenshot per Makro“, bin ich zu dem Schluß gekommen, dass es z.Z. nicht möglich ist mit einfachen Mitteln das in Office integrierte Python auf einfache Weise zur Mitarbeit zu überreden.
Wenn ich nun bedenke, dass Pit bei 50 (oder sonst wieviele) Rechnern Office-Anpassung vornehmen soll, ist für mich das Python-Projekt gestorben.

Deshalb ein neuer Ansatz:
Im Netz habe ich ein schlichtes, kleines Tool für die Screenshoterstellung gefunden, welches sich über die Shell starten läßt.
nircmd.exe
Es ist keine Installation nötig, einfach das Zip-file herunterladen und entpacken.
Der Aufruf über die Kommandozeile sieht dann beispielweise so aus:

Code: Alles auswählen

"C:\Temp\nircmd-x64\nircmd.exe" savescreenshot "c:\temp\screenhot.png"
Jetzt stehen wir abermals vor dem Problem, dass die Datei für 50 Rechner verfügbar gemacht werden muss.
Deshalb stelle ich diese Frage in Anlehnung an Stephan’s Beispiel Das OpenDocument-Dateiformat (odt, ods, odp, ...) als 'Container' nutzen
.

Ist es möglich ein exe-File in den Dokument-Container zu packen, so dass das File über eine Shell-Anweisung aus Basic heraus ausführbar ist?

Wäre dieses möglich, dann ist es für Pit ein Einfaches Screenshot’s zu erstellen.
Sogar mit Datum- und Zeitstempel im Dateinamen.
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Stephan
********
Beiträge: 12348
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Basic: exe-File aus Dokument-Container heraus starten?

Beitrag von Stephan »

Ist es möglich ein exe-File in den Dokument-Container zu packen, so dass das File über eine Shell-Anweisung aus Basic heraus ausführbar ist?
Ja, das geht. Ich habe meine eigene Datei etwa angepasst.

Screenshot kannst Du direkt mittels der Schaltfläche im aktiven Tabellenblatt starten.


Gruß
Stephan
Dateianhänge
nircmd.ods
(84.37 KiB) 24-mal heruntergeladen
craig22
****
Beiträge: 107
Registriert: Mi, 19.08.2020 13:47

Re: Basic: exe-File aus Dokument-Container heraus starten?

Beitrag von craig22 »

Hallo Stephan,

eine ganz GROSSES WOW! 8)

Das ist doch des Rätsels Lösung für Pit und mich.

...und Windows oder der Virenscanner haben nicht gemeckert:)

Vielen Dank!
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Karolus
********
Beiträge: 7152
Registriert: Mo, 02.01.2006 19:48

Re: Basic: exe-File aus Dokument-Container heraus starten?

Beitrag von Karolus »

Hallo
edit: Ich hab die letzten beiden Beiträge verpasst, ignoriert meine Worte und GLÜCKWUNSCH
Der erste Schritt wäre doch jetzt erstmal probieren ob und das aus BASIC per 'shell( …)' oder 'systemShell.execute(…) oder aus python heraus per 'subprocess…) durchläuft.
Wenn da was brauchbares rauskommt, kann man dann den BASIC|python code zusammen mit der …exe in ein Dokument einpacken.
Letzteres ist kein Problem, ersteres kann ich nicht prüfen mangels Windows.

Craig du bist am Zug
Zuletzt geändert von Karolus am Mi, 20.10.2021 21:16, insgesamt 1-mal geändert.
Version: 6.1.5.2
Build-ID: 1:6.1.5-3+rpi1+deb10u6+rpt1
raspberry-pi-OS
Stephan
********
Beiträge: 12348
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Basic: exe-File aus Dokument-Container heraus starten?

Beitrag von Stephan »

Das ist doch des Rätsels Lösung für Pit und mich.
Aber doch nur für Windows.


Gruß
Stephan
craig22
****
Beiträge: 107
Registriert: Mi, 19.08.2020 13:47

Re: Basic: exe-File aus Dokument-Container heraus starten?

Beitrag von craig22 »

@karolus
Python habe ich jetzt ersteinmal auf Eis gelegt, weil ich mich mit Stephan's Variante beschäftige.
Craig du bist am Zug
Das habe ich jetzt davon... :lol:

@Stephan
Nach den ersten erfolgreichen Tests (*), ist nun ein Problem aufgetreten, welches ich mir nicht erklären kann.
(*)Screenshots von der Calc-Oberfläche.

Habe den Rechner inzwischen heruntergefahren, Clipboard ist leer und ich habe Deine Musterdatei nochmals heruntergeladen,
aber ich erhalte keinen Screenshot mehr, sondern eine Bild-Datei, welche ein Fragezeichen-Symbol zeigt:
Fragezeichen Symbol.JPG
Fragezeichen Symbol.JPG (7.99 KiB) 1071 mal betrachtet
Ich bin mittlerweile vollkommen ratlos.
Das Symbol stammt wohl von dem Hilfe-Button in Deinem Dialog, allerdings weist die Pfadangabe
in den Eigenschaften des Designer auf einen Pfad auf Laufwerk D:\..., dieses ist bei mir nicht vorhanden.
So vermute ich, dass Office die Symbolinformationen irgendwo anders in der Datei gespeichert hat.

Es betrifft AOO und LO.
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
cosmo17
*
Beiträge: 10
Registriert: So, 06.06.2021 11:15

Re: Basic: exe-File aus Dokument-Container heraus starten?

Beitrag von cosmo17 »

Hmmm, sehr interessant!

Ich mach so was aehnliches in Base, aber mit Gadwin Printscreen. Da press ich einfach den prtscrn key und multiple images werden mit zeit datum in einem vorbestimmten folder gespeichert.
Vielleicht fuer einen neuen post waere die Frage wie man diese Images hernach in ein Writer oder pdf doc automatisch einfuegen kann.
Das waere naemlich auch ein work around fuer das dilemma dass man in base keine sub reports herstellen kann.

mfg
Stephan
********
Beiträge: 12348
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Basic: exe-File aus Dokument-Container heraus starten?

Beitrag von Stephan »

Ich weiß nicht was Du hier durcheinanderbringst. Wie geschrieben hatte ich meine Datei nur "etwas" angepasst, was meint ich war zu faul alles Überflüssige zu löschen.

So wird nun das vorhandenen Bild (das FRagezeichen) weiterhin entpackt (obwohl es nicht gebraucht wird) und zwar nach dem Temp-Pfad des aktuellen Benutzers.

Falls Du nun die ods-Datei nicht abspeicherst, sondern 'einfach so' aus dem Browser heraus öffnest ist dieser Pfad u.U. zufällig (abhängig von Betriebssystem und Browser) identisch mit dem Pfad der ods-Datei und der Screenshot wird mit gleichem Namen im gleichen Pfad zu speichern versucht wie die vorhandene Bild-Datei und anscheinend wird dabei bei Dir das Bild nicht überschrieben (bei mir schon, deshalb ist mir das nicht aufgefallen) - alles aus dem Code heraus nachvollziehbar.

z.B. ändere:

Code: Alles auswählen

Shell(ConvertFromURL(tmp & "/nircmd.exe"),1, "savescreenshot " & ConvertFromURL(tmp2 & "/bild.png"))
in:

Code: Alles auswählen

Shell(ConvertFromURL(tmp & "/nircmd.exe"),1, "savescreenshot " & ConvertFromURL(tmp2 & "/screenshot.png"))
wobei das konkrete Makro ja ohnehin nur ein Beispiel ist, das für die richtige Datei (den Rechentrainer) angepasst werden muss und logischerweise sollte dabei alles Überflüssige an Makros und Dateien entfernt werden, also "Sub dlg_start()", "Sub datum_eintragen()", "Sub hilfe_aufrufen()", "Sub entfernen()", sowie "bild.png" und "hilfe.pdf" und die entsprechenden Einträge aus der Datei "manifest.xml".
in den Eigenschaften des Designer auf einen Pfad auf Laufwerk D:\..., dieses ist bei mir nicht vorhanden.
Ja richtig. Der Pfad stammt augenscheinlich von dem System wo ich die Datei vor Jahren zuletzt getestet habe und aber ist doch völlig belanglos weil er ohnehin bei Start des Dialogs durch das Makro "Sub dlg_start()" überschrieben wird. Ohnehin hat das nichts mit dem Screenshot zu tun, sondern stammt aus der bisherigen Datei und ich habe es nur nicht gelöscht.



Gruß
Stephan
craig22
****
Beiträge: 107
Registriert: Mi, 19.08.2020 13:47

Re: Basic: exe-File aus Dokument-Container heraus starten?

Beitrag von craig22 »

@Stephan
Stephan hat geschrieben:Ich weiß nicht was Du hier durcheinanderbringst. Wie geschrieben hatte ich meine Datei nur "etwas" angepasst, was meint ich war zu faul alles Überflüssige zu löschen.
Nein, ich habe Dich voll und ganz verstanden, auch dass der Code noch angepasst werden muss.
In diesem Zusammenhang habe ich festgestellt, dass das Makro Deines Musters nur funktioniert,
wenn sich die Calc-Datei im .../%temp% Ordner befindet.
Kopiere ich die Datei in z.B. c:\temp, dann funktioniert sie nicht mehr. D.h. der Code läuft fehlerfrei durch aber es wird kein Screenshot.png gespeichert.

Jetzt habe ich den Code umgeschrieben. Er funktioniert, bis auf eine Kleinigkeit.
Wenn ich die Calcdatei aus einem beliebigen Ordner aufrufe, z.B. c:\temp, dann wird immer ein Screenshot erzeugt,
aber das Bild wird nicht im selben Ordner der Calcdatei gespeichert, sondern immer in:
...\AppData\Local\VirtualStore\Program Files\LibreOffice\program\...

Für einen weiteren Tipp wäre ich Dir sehr dankbar:
Also Pfad der Bild-Datei = Pfad der Calc-Datei.
nircmd 2.ods
(85.07 KiB) 25-mal heruntergeladen
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Stephan
********
Beiträge: 12348
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Basic: exe-File aus Dokument-Container heraus starten?

Beitrag von Stephan »

Er funktioniert, bis auf eine Kleinigkeit.
aber dann nur durch Zufall, denn der Pfad zur exe steht doch fest im Shellaufruf:

Code: Alles auswählen

Shell("""C:\Temp\_Stephan\Screenshot mit eingebettetem NIRCMD\nircmd.exe""",1, "savescreenshot " & sBildName)
und das kann nicht funktionieren, da doch die exe in einen Variablen Pfad ausgepackt wird:

Code: Alles auswählen

schreiben.WriteFile(sDirUrl & "/" & alles(2), stream)
aber das Bild wird nicht im selben Ordner der Calcdatei gespeichert, sondern immer in:
...\AppData\Local\VirtualStore\Program Files\LibreOffice\program\...
überraschendes (oder übersehe ich etwas?) Programmverhalten, das das Bild gerade in diesem Pfad gespeichert wird - das es nicht im gewünschten Pfad gespeichert wird ist deshalb so weil garkein Pfad angegeben wird, denn "sBildName" ist nur ein Dateiname ohne Pfad;

Code: Alles auswählen

Shell("""C:\Temp\_Stephan\Screenshot mit eingebettetem NIRCMD\nircmd.exe""",1, "savescreenshot " & sBildName)
hier hingegen gibt es einen Pfad, nämlich "sDirPath":

Code: Alles auswählen

' Programm-Hinweis
Msgbox "Screenshot gespeichert in: " & chr(10) & _
sDirPath & "\" & sBildname,64, "Programmende"

ich habe jetzt den Code korrigiert und etwas besser geschrieben, so sollte es passen:

Code: Alles auswählen

Dim sUrl$, sDirUrl$
Dim sPath$, sDirPath$

Sub initialisieren()
	GlobalScope.BasicLibraries.loadLibrary("Tools")
	sUrl = ThisComponent.URL
	'Den Pfad ohne Dateiname extrahieren
	sDirPath = DirectoryNameoutofPath(sUrl,"/")
	
	ThisComponent.calculate()
	
	z = createUnoService("com.sun.star.packages.Package")
	Dim args(0)
	args(0) = ThisComponent.URL
	z.initialize(args())
			
	schreiben =	createUnoService("com.sun.star.ucb.SimpleFileAccess")
	stream = z.getByHierarchicalName("hilfe/" & "nircmd.exe").GetInputStream()
	schreiben.WriteFile(sDirPath & "/nircmd.exe", stream)
End Sub


Sub screeenhot()

	initialisieren()

	' Datum- und Zeitstempel formatieren
	sStamp = "_" & Format(Year(Now), "0000") & Format(Month(Now), "00") & Format(Day(Now), "00") & "_" & _
                       Format(Hour(Now), "00") & "-" & Format(Minute(Now), "00") & "-" & Format(Second(Now), "00")
	' Dateiname zusammensetzen
	sBildName = "Bild2" & sStamp & ".png"

		' Programm über die Kommandozeile aufrufe, die Parameter übergeben und den Screenshot speichern
		Shell("""" & ConvertFromURL(sDirPath & "/nircmd.exe") & """", 1, "savescreenshot " & ConvertFromURL(sDirPath & "/" & sBildname))
	Wait 10 'warten damit Dialog nicht auf Screenshot sichtbar wird
	' Programm-Hinweis
	Msgbox "Screenshot gespeichert in: " & chr(10) & _
					ConvertFromURL(sDirPath & "/" & sBildname),64, "Programmende"
End Sub

Gruß
Stephan
craig22
****
Beiträge: 107
Registriert: Mi, 19.08.2020 13:47

Re: Basic: exe-File aus Dokument-Container heraus starten?

Beitrag von craig22 »

@Stephan
Es tut mir leid, aber es wird mit deinem neuen Code kein Screenshot gespeichert.

Edit:
Die Lösung liegt in der Shell-Anweisung, dort müssen noch zusätzliche Anführungszeichen eingefügt werden:

Code: Alles auswählen

		' Programm über die Kommandozeile aufrufe, die Parameter übergeben und den Screenshot speichern
		Shell("""" & ConvertFromURL(sDirPath & "/nircmd.exe") & """", 1, "savescreenshot "   & """" &  ConvertFromURL(sDirPath & "/" & sBildname) & """")
Dies, weil Windows bekanntlich Probleme hat Pfadangaben mit Leerzeichen aufzulösen.

Ich bedanke mich recht herzlich für Deinen Einsatz, welcher sich absolut gelohnt hat.

Und was sagt nun Pit zu der Lösung?
Gebrauchsfähig?
Zuletzt geändert von craig22 am Do, 21.10.2021 22:00, insgesamt 1-mal geändert.
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Stephan
********
Beiträge: 12348
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Basic: exe-File aus Dokument-Container heraus starten?

Beitrag von Stephan »

aber es wird mit deinem neuen Code kein Screenshot gespeichert.
und was passiert stattdessen?

Ich hänge mal die vollständige Datei an, diese funktioniert bei mir auch in c:\temp\.


Gruß
Stephan
Dateianhänge
nircmd 2.ods
(83.6 KiB) 20-mal heruntergeladen
craig22
****
Beiträge: 107
Registriert: Mi, 19.08.2020 13:47

Re: Basic: exe-File aus Dokument-Container heraus starten?

Beitrag von craig22 »

@Stephan,

unsere letzten Beiträge haben sich überschnitten:
  • C:\temp
    funktioniert, weil keine Leezeichen im Pfad vorhanden sind
  • c:\temp\ x y z
    funktioniert nicht, wg. der Leerzeichen
    Deshalb muss die Pfadangabe mit zusätzlichen Anführungzeichen in der Shellanweisung geklammert werden.
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Stephan
********
Beiträge: 12348
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Basic: exe-File aus Dokument-Container heraus starten?

Beitrag von Stephan »

Du hast REcht, ich habe das übersehen OBWOHL ich zufällig sogar:

Code: Alles auswählen

sBildName = "Bild 2" & sStamp & ".png"
geändert hatte zu:

Code: Alles auswählen

sBildName = "Bild2" & sStamp & ".png"
um dort das Problem mit dem einen Leerzeichen en passant zu umgehen.


Gruß
Stephan
craig22
****
Beiträge: 107
Registriert: Mi, 19.08.2020 13:47

Re: Basic: exe-File aus Dokument-Container heraus starten?

Beitrag von craig22 »

@Stephan,

nun das betrifft den Dateinamen, als auch den Pfad selbst.

c:\Temp\x y z\Bild.png
oder auch
c:\Temp\x y z\Bild Name xyz.png

In diesen beiden Fällen, muss der gesamte Pfad zusätzlich geklammert werden.
Was erzähle, das weißt Du ja selbst. :)

Ich bin total happy über diese gute Container-Lösung. Einfach genial.
Mir sind da gleich ein paar andere private Projekte eingefallen, wo ich dies auch nutzen kann.

Nochmals vielen Dank.
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Antworten