Dateivorschau per Interface IPreviewHandler

    • VB.NET
    • .NET (FX) 4.5–4.8

    Es gibt 55 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

      @GOKTerek Urlaub beendet. Deswegen ein erneuter Test. Funktioniert bestens. Auch mit Exceldateien (Office 365). Hier ein Link wie man die Preview von Officedateien reparieren/überprüfen kann: hasslinger.com/index.php/de/bl…ie-temp-umgebungsvariable

      Falls sich mal die Preview vom Edge für PDFs eingenistet hat, obwohl der AcrobatReader installiert und dieser der Standardbetrachter ist, dann folgende Reg importieren bzw selbst den Key ändern. Dann funktioniert auch die Preview mit den AcrobatReader wieder.
      ​ Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.pdf\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}] @="{DC6EFB56-9CFA-464D-8880-44885D7DC193}"
      Mfg -Franky-
      Hi @-Franky- ,

      erst mal ein fettes Lob für diesen Code.
      Bin jetzt erst dazu gekommen, diesen in mein Projekt einzubauen.
      Und was soll ich sagen - funzt perfetto. ^^
      Danke Dir recht sakrisch für das Publizieren dieser Klasse! :thumbsup:

      Aber ich habe hier keinen Hinweis gefunden, ob man diesen Code auch in eigene (kommerzielle) Software einbauen darf und falls ja, ob ein Hinweis in der Dokumentation auf Dich als Autor erforderlich ist.
      Kannst mich bitte schlau machen, wie Du das gehandhabt haben willst?

      Übrigens - bei den ersten Versuchen mit parallel geöffnetem App IPreview von Dir und meinem Projekt mit Deinem eingebundenem Preview-Script und wechselseitigem Aufrufen der beiden Apps unter Nutzung der Preview-Funktionen kam es zu einer Speicherschutzverletzung, welche das weitere Anzeigen von Doc-Previews (andere Formate funktionierten aber) verhinderte. Die PicBox zeigte dann bei Docs nur das Word-Symbol.
      Auch mehrfache Neustarts der beiden Apps brachten keine Abhilfe.
      Erst nach einem Rechner-Neustart und folgendem ausschliesslichen Start meiner Anwendung flutschte es wieder.

      Beste Grüsse
      Hi

      Klar kannst Du den Code in Deiner Software einbauen. Da das ganze gut durch MS dokumentiert ist wie es funktioniert, erhebe ich auch kein Anspruch auf Nennung als Autor. Kannst Du gern machen, ist aber kein muss.

      Zu dem Problem kann ich im moment nichts sagen. Ist mir bisher so, wie in Deiner Konstellation, nicht aufgefallen bzw. habe ich nie ausprobiert. Eventuell hab ich da noch einen Fehler im Code der einen PreviewHandler nicht korrekt beendet. Dann müsstest Du auch entsprechende Prozesse im Taskmanager sehen. Also für DOC müssten dann mehrere Word-Prozesse laufen die nicht korrekt beendet werden.
      Mfg -Franky-
      Superklasse!

      Danke Dir vielmals. :thumbsup:

      Das Problem tritt ja nicht auf, wenn nur meine App mit Deinem PreviewHandler läuft.
      Diese Situation passierte dann auch nicht wieder, nachdem ich Dein Script erfolgreich in mein Projekt eingekonotet habe und nur meine App am Start war.
      Vielleicht kommt mal von einem Kunden eine entsprechende Response.
      Solange warte ich mal...
      @-Franky-
      Aha, gerade nochmal erlebt...
      Hatte mein Projekt gestartet, darin den PreviewHandler benutzt und dann VS2022 beendet und das Inno-Setup zum Paket bauen gestartet.
      Dann habe ich das Installationspaket ausgeführt und die neu installierte Exe gestartet - Nur Symbol im Doc-Preview.
      Im Taskmanager waren noch Prozesse von Excel und Word aktiv.
      Nachdem ich beide abgeschossen hatte und die Exe erneut startete, war wieder alles prima.
      Scheint, als ob die Prozesse wirklich nicht beendet würden.
      Habe jetzt nochmal explizit

      VB.NET-Quellcode

      1. Preview.ClosePreview()

      in die "Mainform_FormClosing" eingefügt, aber dennoch bleiben die Office-Prozesse am Laufen.

      EDIT: Entwarnung...
      Nach einem Neustart meines Rechners und erneutem Testen klappt es nun - alle Office-Prozesse werden mit dem FormClosing beendet.
      Da hatte sich wohl was festgesetzt.
      Mein Preview.closePreview im laufenden Script wurde wohl unter ungünstigen Bedingungen (offenes Preview beim Schliessen der Anwendung) nicht ausgeführt.
      Jetzt scheint alles zu klappen.
      Bilder
      • PreviewHandler.jpg

        290,95 kB, 1.920×1.200, 96 mal angesehen

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dideldum“ ()

      Hi @-Franky-
      Jetzt klappt alles fein mit Deinem IPreviewHandler - total stabil und ohne Probleme.
      Nur bekomme ich es nicht hin, dass beim Mainform.resizeEnd das vom IPreviewHandler generierte Bild in der PixBox entsprechend der neuen Abmessungen des Parent-Controls angepasst angezeigt wird.
      Könntest Du mir dazu vielleicht einen Tip geben?
      Wäre supernett ^^
      Also -Franky- callt die Funktion SetRect vom Interface in der Funktion ResizePreview, also probier mal wie in der Beispielmappe:

      VB.NET-Quellcode

      1. ' funktioniert nicht für alle Dateien
      2. Preview.ResizePreview(New Size(300, 300))
      Zitat von mir 2023:
      Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
      Servus @DTF
      Super, danke Dir!
      mit:

      VB.NET-Quellcode

      1. If tsc_WindowsViewer.Visible = True Then
      2. tsc_WindowsViewer_PictureBox.Size = tsc_WindowsViewer.ContentPanel.Size
      3. Preview.ResizePreview(New Size(tsc_WindowsViewer_PictureBox.GetPreferredSize(Me.Size).Width, tsc_WindowsViewer_PictureBox.GetPreferredSize(Me.Size).Height))
      4. End If

      im Resize klappt es perfekt :)

      Schönen Rest-Sonntag ^^

      Dideldum schrieb:

      Preview.ResizePreview(New Size(tsc_WindowsViewer_PictureBox.GetPreferredSize(Me.Size).Width, tsc_WindowsViewer_PictureBox.GetPreferredSize(Me.Size).Height))


      Mach das so:

      VB.NET-Quellcode

      1. Preview.ResizePreview(sc_WindowsViewer_PictureBox.GetPreferredSize(Me.Size))


      @-Franky-

      Hab da was gesehen:

      VB.NET-Quellcode

      1. Private Function CreateInterface(CLSID As String, IID As String) As IntPtr
      2. Dim pInterface As IntPtr = IntPtr.Zero
      3. If CoCreateInstance(New Guid(CLSID), IntPtr.Zero, CLSCTX_LOCAL_SERVER, New Guid(IID), pInterface) = S_OK Then
      4. Return pInterface
      5. ElseIf CoCreateInstance(New Guid(CLSID), IntPtr.Zero, CLSCTX_INPROC_SERVER, New Guid(IID), pInterface) = S_OK Then
      6. Return pInterface
      7. End If
      8. End Function


      Warum ein 2. mal CoCreateInstance callen, wenn es beim ersten mal nicht klappt? Wäre doch besser den HRESULT auszuwerten, und was passiert wenn es beide male nicht klappt? Es geben ja nicht alle Codepfade einen Wert zurück.
      Zitat von mir 2023:
      Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
      @DTF Ich hatte festgestellt das, insbesondere der PDF-PreviewHandler vom AcrobatReader, beim Initialisieren Probleme macht und daher der Fallback auf CLSCTX_INPROC_SERVER. Standard wäre in diesem Fall CLSCTX_LOCAL_SERVER. Daher der zweite Aufruf falls der erste fehlschlägt. Erst wenn beide Möglichkeiten fehlschlagen gibt die Funktion IntPtr.Zero zurück. Da die meisten APIs und Interfaces S_OK, in wenigen Fällen auch einen anderen hResult, als Erfolg zurückgeben, interessiert mich persönlich nicht so sehr warum hResult <> S_Ok war. Es gibt mit Sicherheit Ausnahmen wo man den hResult genauer untersuchen müsste um auf Fehler zu reagieren.
      Mfg -Franky-
      Huch, hab den Unterschied nicht gesehen, LOCAL und INPROC. Aber es fehlt trotzdem ein Return Statement. Wird das in VB nicht als Fehler gemeldet?(Oder hast du was in der Mappe umgestellt?) Mit C# würde das so nicht kompilieren.
      Zitat von mir 2023:
      Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

      DTF schrieb:

      Wird das in VB nicht als Fehler gemeldet?(Oder hast du was in der Mappe umgestellt?)
      Kann ich Dir im Moment gar nicht sagen. Komme gerade nicht an meinem Code. Aber wenn da was wäre, dann hätte ich schon beim erstellen des Code gesehen das da was im Argen ist. Umgestellt an der Mappe habe ich nichts.

      Edit: Oh, komme ja doch dran. Nope. VB zeigt hier keinen Fehler. :D
      Mfg -Franky-

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „-Franky-“ ()

      So, jetzt hab ich genug Kaffee drin. Hab die Frage falsch gestellt. Ich meinte sollte das nicht als Fehler gemeldet werden, wäre die richtige Frage gewesen. Hab ja deine Mappe runtergeladen und mal durchgeschaut, kann kompiliert und ausgeführt werden. Funktionen sollten immer was zurückgeben. In C# wird das als Fehler gewertet, was IMO auch richtig ist.
      Bilder
      • Unbenannt.jpg

        31,61 kB, 749×189, 76 mal angesehen
      Zitat von mir 2023:
      Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
      Weil bei fehlender Angabe (leider automatisch) IntPtr.Zero zurückgegeben wird. Bei vielen anderen Rückgabedatentypen wird gemeckert, dass ein Rückgabewert fehlt.
      Siehe stackoverflow, 1. Antwort
      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

      Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
      Aha, eine komische Eigenart von VB. Hab das in C# statt mit nint nun auch mit IntPtr probiert, ich hatte das ja mit nint gemacht oben mit der Fehlermeldung(NativeSizedInteger, gibt es in VB nicht) . Aber beruhigend, das IntPtr da in VB eine Ausnahme ist, auch wenn das IMO unsauber ist.

      PS:
      Ist scheinbar mit allen ValueTypes so.
      Zitat von mir 2023:
      Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DTF“ ()

      Hi @-Franky-

      ich verwende ja Deinen IPreview-Handler in meinem Projekt. Der funzt auch supi. :)

      Ich habe viele uralte Bilder aus Cliparts98 usw. (also wirklich uralte) Bilder im WMF-Format, welche sich zum Teil - warum, weiss ich nicht - nicht in der IPreview anzeigen lassen.

      Der Explorer zeigt dabei eine leere Fläche, Dein IPreview-Handler zeigt in diesem Fall das unten gezeigte Bild "Programmfenster2".
      Mein eigener Pic-Editor zeigt das Bild "Programmfenster1".

      Nun habe ich mit unmotivierten Programmabbrüchen zu kämpfen.
      Nach vielen Versuchen habe ich herausgefunden, dass die Abbrüche nur auftreten, wenn ich:

      Im Programm viele der nicht anzeigbaren Bild-Objekte aufrufe und gleichzeitig im Programm der IPreview Handler zur Anzeige von Bild-Objekten aktiviert ist.
      Bei Aktivierung meines eigenen Bild-Editors läuft das Programm ohne diese Abbrüche.

      Kann es vielleicht sein, dass in Deinem IPreview-Handler beim Ladeversuch der nicht anzeigbaren Bilder oder in der Anzeige des Ersatz-Bilds ein Stack überläuft oder irgendwas nicht sauber disposed wird?
      Bilder
      • Programmfenster1.jpg

        262,92 kB, 1.672×1.112, 59 mal angesehen
      • Programmfenster2.jpg

        223,5 kB, 1.670×1.116, 57 mal angesehen
      Hi. Ich bin derzeit im Urlaub und kann daher erstmal nichts zu sagen. Was ich aber sehe ist, das der zusätzliche Code, der ja nichts mit mit dem IPreviewHandler zu tun hat, das Icon vom IrfanView lädt. Demnach gibt es bei Dir kein Handler für WMF Dateien oder der Handler ist defekt bzw wurde verdreht. Step einfach mal den Code durch und schau mal ob ich irgendwo ein Dispose oder Release vergessen habe.
      Mfg -Franky-
      Hi @-Franky-

      danke Dir - na dann wünsche ich einen super geruhsamen bzw. extrem aufregenden Urlaub (je nach Deinen Präferenzen) ^^

      Nein, nein, WMF-Dateien werden eigentlich schon in meinem Proggi angezeigt - sowohl im IPreview-Handler, als auch in meinem Pic-Editor.
      Nur habe ich eben viele uralte WMF die wohl ein nicht mehr unterstütztes Format haben.
      Und wenn ich da eine Liste solcher nicht (mehr) kompatibler WMF-Bilder durchblättere, steigt irgendwann mein Proggi sang- und klanglos aus.
      Aber nur, wenn ich diese im IPreview-Handler durchblättere, nicht aber, wenn ich diese in meinem Pic-Editor durchlaufen lasse.
      Daher habe ich das Fehler-Handling im IPreview im Verdacht, dass da bei jedem von diesem nicht anzeigbaren Bild vielleicht ein sich aufsummierendes Problem ergibt, welches irgendwann zum Programm-Coitus führt.

      EDIT:
      Ah, habe wahrscheinlich das Problem identifiziert...
      answers.microsoft.com/en-us/wi…08-48b3-9f7e-ba441684db24
      Win10 mag keine WMF mehr.
      IRFan kann zwar WMF anzeigen - aber wenn ich diese im IPreview laden lassen will, schmiert mein Proggi ab.
      Und das nur bei 16Bit WMF - nicht aber bei 32Bit WMFs.
      Habe jetzt die WMFs einfach in JPG umformatiert - und dabei leider die Ordnersortierung verloren, aber jetzt wenigstens alle Bilder im ICE verfügbar.
      Problem beseitigt. ;)

      Beste Grüsse

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Dideldum“ ()

      @Dideldum Ich hoffe Du hast noch ein paar von diesen WMF Dateien die da Probleme verursacht haben. Dann könntest mal ein zwei Dateien davon, in ein ZIP verpackt, hier hochladen und ich könnte mir das mal anschauen. Kann sein das alte WMFs von der Preview wegen Sicherheitsbedenken ausgeschlossen wurden. Dennoch sollte das kein Absturz verursachen. Ansonsten würde der Explorer ja auch abstürzen weil der nutzt ja das gleiche Interface für die Preview.
      Mfg -Franky-