Seite 1 von 1
Datei mit Standardprogramm öffnen - schreibgeschützt
Verfasst: Mo, 17. Sep 2018 7:58
von Jan
Hallo,
bei vielen Dateiformaten setze ich diesen Aufruf ein (das habe ich aus einem Sample von Anand Gupta in der Alaska NG übernommen):
Code: Alles auswählen
lSuccess := DllCall("SHELL32.DLL", ;
DLL_STDCALL, ;
"ShellExecuteA", ;
AppDesktop():GetHWND(), ;
"open", ;
AllTrim(cFile), ;
NIL, ;
CurDir(), ;
SW_NORMAL)
Damit kann ich cFile mit dem auf diesem Rechner vorgesehenen Standardprogramm öffnen, ohne mich um irgendwelche Dateiformate, Einstellungen, etc. kümmern zu müssen.
Jetzt habe ich aber die Anforderung bekommen, Dateien schreibgeschützt zu öffnen. Und das auch so, das der Benutzer den Schreibschutz nicht aufheben kann - MS-Programme bieten das ja teilweise in der ockerfarbenen Hinweiszeile an. Das betrifft in erster Linie MS Word und Excel. Eventuell aber auch andere Formate.
Kann man das irgendwie mitgeben?
Wenn das so einfach nicht geht: Wie würde ich eine Word- oder Excel-Datei mit Office 2010 bzw. 2016 schreibgeschützt öffnen?
Jan
Re: Datei mit Standardprogramm öffnen - schreibgeschützt
Verfasst: Mo, 17. Sep 2018 8:24
von Koverhage
Hallo Jan,
hier für Word, allerdings direkt via Activex
Code: Alles auswählen
FUNCTION WordShowDocument(cFile)
Local oWord, ;
oDoc, ;
lOpenReadOnly := .T., ;
lWordFinished := .f., ;
lFound := .f., ;
nEvent := 0, ;
mp1 := 0, ;
mp2 := 0, ;
cBriefform := rtrim(fi->briefform), ;
mess1 := LGTrans('0051001','Microsoft Word ist nicht installiert')
#if XPPDEVVER > 01890000
// Erzeugen einer ActiveX-Komponente
oWord := CreateObject("Word.Application")
IF Empty( oWord )
oWord := CreateObject("opendocument.WriterDocument.1")
ENDIF
IF Empty( oWord )
MsgBox( mess1 )
Return .f.
ENDIF
lFound := Fexists(cDos2Win(cFile) )
IF !lFound .and. cBriefform = "DOCX"
cFile := strtran(cFile, ".DOCX", ".DOC")
lFound := Fexists(cFile)
ENDIF
IF !lFound
return .f.
ENDIF
oWord := oWord:dynamicCast(ActiveXObject())
oWord:Quit := {||lWordFinished := .T.}
oWord:DisplayAlerts := WdAlertsNone
oWord:Visible := .T.
lWordFinished := .F.
// Oeffnen eines Word-Dokuments und Zugriff auf
// eine Sammlung von Lesezeichen
oWord:documents:open( cFile,,lOpenReadOnly )
oDoc := oWord:ActiveDocument
Do WHILE !lWordFinished
// Just wait
nEvent := AppEvent( @mp1, @mp2, , 1)
EndDo
oWord:destroy()
#endif
RETURN .t.
Re: Datei mit Standardprogramm öffnen - schreibgeschützt
Verfasst: Mo, 17. Sep 2018 9:21
von brandelh
Das Schreibschutzattribut der Datei setzen, dann eine kleine Wartezeit z.B. sleep(10) danach öffnen, das Attribut erkennt jede Software spätestens beim Schreibversuch.
Re: Datei mit Standardprogramm öffnen - schreibgeschützt
Verfasst: Mo, 17. Sep 2018 10:35
von Tom
Es muss auch mit Runshell gehen. Ich schaue gleich mal.
Re: Datei mit Standardprogramm öffnen - schreibgeschützt
Verfasst: Mo, 17. Sep 2018 16:01
von Jan
Ich behelfe mir im Moment damit, das ich die Datei in das lokale Temp-Verzeichnis kopiere, und dann dort öffne. Dann können die Ändern was die wollen - das Original bleibt unverändert.
Da ich die Dateien ohnehin vom Server hole, ist das zwischenspeichern auf der lokalen SSD dann auch keine fühlbare Verzögerung mehr.
Jan
Re: Datei mit Standardprogramm öffnen - schreibgeschützt
Verfasst: Mo, 17. Sep 2018 16:48
von Tom
Bei Excel wäre es simpel der Aufrufparameter /R in Runshell. Geht das bei Word nicht auch?
Re: Datei mit Standardprogramm öffnen - schreibgeschützt
Verfasst: Mo, 17. Sep 2018 17:03
von Koverhage
Nein, bei Word wird mit /R die Daten neu in die Registry geschrieben.
Re: Datei mit Standardprogramm öffnen - schreibgeschützt
Verfasst: Mo, 17. Sep 2018 21:22
von Jan
Mit runshell kann ich aber immer nur ein bestimmtes Programm öffnen? Das wäre doof, denn dann muß ich für alle möglichen Dateiendungen verschiedene runshells abarbeiten. Und weiß trozdem nicht, womit der Mitarbeiter z. B. eine PDF öffnen möchte (Adobe, Foxit, Edge, ...). Das ist das schöne an der von mir oben geposteten Lösung - da kann ich jede Dateiendung mit egal welchem Programm öffnen. Je nachdem, was der User bei sich eingestellt hat. Das Problem ist halt, daß das mit den Parametern schwierig wird.
Jan
Re: Datei mit Standardprogramm öffnen - schreibgeschützt
Verfasst: Mo, 17. Sep 2018 22:27
von AUGE_OHR
hi,
der 4th Parameter bei ShellExecuteA ist nicht NIL sondern NULL ... oder eben die Verbs (als String) die man haben will.