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.