Die Shell-Funktion hat einen obligaten und 3 optionale Argumente:
Code: Alles auswählen
Shell (Pathname As String[, Windowstyle As Integer][, Param As String][, bSync])
bei:
Shell(stFeld,,0) ist der 3. Parameter ein Integer=0, der 3. Parameter muss aber als "[, Param As String]" übergeben werden. daher vermutlich der Fehler.
sollte funktionieren! Es gibt natürlich Shell/Programm-Kombinationen, die diese "0" ignorieren (oder besser gesagt: Du bekommst keinen Fehler, weil dieser nur in der Shell angezeigt wird, oder das externe Programm einen Parameter "0" ignoriert oder oder oder)
Verkürzt sollte dieser Code ausreichen:
Code: Alles auswählen
SUB ZOOM1
oDoc=thisComponent
stCurrPath = split(oDoc.Parent.Url, oDoc.Parent.Title)(0)
stFile = oDoc.Drawpage.Forms.getByName("MainForm").getByName("Grafisches Steuerelement 1").BoundField.getString()
stFile = convertfromurl(stCurrPath + stFile)
stShellCmd = stCurrPath + "bildvermessen.exe " + stFile
Shell(stShellCmd)
END SUB
Um zu testen ob die Datei existiert kann man z.B. FileExists() verwenden:
Code: Alles auswählen
SUB ZOOM1
oDoc=thisComponent
stCurrPath = split(oDoc.Parent.Url, oDoc.Parent.Title)(0)
stFile = oDoc.Drawpage.Forms.getByName("MainForm").getByName("Grafisches Steuerelement 1").BoundField.getString()
stFile = convertfromurl(stCurrPath + stFile)
if FileExists(stFile) then
stShellCmd = stCurrPath + "bildvermessen.exe " + stFile
Shell(stShellCmd)
else
Msgbox(stCurrPath + stFile & " gibt's nicht!")
end if
END SUB
Das größte Problem bei der Shell()-Funktion ist eigentlich die korrekte Übergabe der Parameter für das externe Programm. Verantwortlich dafür ist weniger das Programm das man aufruft, sondern die Art und Weise wie die jeweilige Systemshell mit Calls (vor allem mit Leerzeichen umgeht, Stichwort: "automatische Shellextension"). Bein manchen Programmen müssen die Parameter an Position 3 ([, Param As String]) übergeben werden, bei anderen wiederum funktioniert "Pathname As String" mit den Parametern dazu (so wie Du das in Deiner Lösung machst). Hier immer
Achtung auf Leerzeichen in Pfad/Dateiname!!! Ggf. muss man Parameter in Singlequotes, Doublequotes oder auch mit Escapesequenzen übergeben. Hier hilft einfach nur probieren probieren probieren.
In ganz hartnäckigen Fällen hilft es das Programm in ein Script zu verpacken und dieses dann aufzufrufen, bei noch hartnäckigerer Weigerung muss man mit Shell() die gewünschte Systemshell aufrufen und innerhalb dieser dann erst das eigentliche Programm ...
Das UnoService "com.sun.star.system.SystemShellExecute" braucht man nicht extra aufzurufen, es muss sowieso laufen. Vor allem bringt es nichts eines zu kreieren und es dann nicht zu verwenden (Das müsste dann mit oShell.execute() gemacht werden!)