Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Preview Handler für den Explorer (https://www.delphipraxis.net/216767-preview-handler-fuer-den-explorer.html)

bcvs 26. Feb 2025 15:11

Preview Handler für den Explorer
 
Hallo zusammen,

ich brauche einen Preview für den Explorer für ein eigenes Datenformat. Dazu habe ich diesen Artikel von Uwe Raabe gefunden:
http://www.uweraabe.de/Blog/2011/06/...he-delphi-way/

Das funktioniert bei mir auch wunderbar mit den bpl-Dateien aus dem Beispiel. Die Vorschau zeigt zum Test einfach nur den Dateinamen an.

Sobald ich das aber auf meine eigene Endung .inz ändere und die dll registriere, erscheint im Explorer nur noch "Es ist keine Vorschau verfügbar".

Hier meine Unit:

Delphi-Quellcode:
unit MyINZPreviewHandler;

interface

uses
  PreviewHandler, Classes, VCL.Controls, VCL.StdCtrls;

const
  {$REGION 'Unique ClassID of your PreviewHandler'}
  ///   <summary>Unique ClassID of your PreviewHandler</summary>
  ///   <remarks>Don't forget to create a new one. Best use Ctrl-G.</remarks>
  {$ENDREGION}
  CLASS_MyPreviewHandlerBPL: TGUID = '{0A37D2E3-D22D-4BDF-AAFC-09BC60C3CFE1}';
  CLASS_MyPreviewHandlerINZ: TGUID = '{13DC9D89-1DBB-408F-AF6C-5B3E43276215}';

type
  {$REGION 'Sample PreviewHandler'}
  ///   <summary>Sample PreviewHandler</summary>
  ///   <remarks>A sample PreviewHandler. You only have to derive from
  ///   TFilePreviewHandler or TStreamPreviewHandler and override some methods.</remarks>
  {$ENDREGION}
  TMyPreviewHandler = class(TFilePreviewHandler)
  private
    FTextLabel: TLabel;
  protected
  public
    constructor Create(AParent: TWinControl); override;
    procedure Unload; override;
    procedure DoPreview(const FilePath: string); override;
    property TextLabel: TLabel read FTextLabel;
  end;

implementation

uses
  SysUtils;

constructor TMyPreviewHandler.Create(AParent: TWinControl);
begin
  inherited;
  FTextLabel := TLabel.Create(AParent);
  FTextLabel.Parent := AParent;
  FTextLabel.AutoSize := false;
  FTextLabel.Align := alClient;
  FTextLabel.Alignment := taCenter;
  FTextLabel.Layout := tlCenter;
  FTextLabel.WordWrap := true;
end;

procedure TMyPreviewHandler.DoPreview(const FilePath: string);
begin
  TextLabel.Caption := 'Datei: '+FilePath;
end;

procedure TMyPreviewHandler.Unload;
begin
  TextLabel.Caption := '';
  inherited;
end;

initialization
  { Register your PreviewHandler with the ClassID, name, descripton and file extension }
  TMyPreviewHandler.Register(CLASS_MyPreviewHandlerINZ, 'inzfile', 'Notiz Preview', '.inz'); // <-- Das funktioniert nicht
//  TMyPreviewHandler.Register(CLASS_MyPreviewHandlerBPL, 'bplfile', 'BPL Binary Preview Handler', '.bpl'); // <-- Das funktioniert
end.

Kann es vielleicht daran liegen, dass bpl schon irgendwo registriert ist, weil Delphi installiert ist? ODer was fehlt da sont noch?

jaenicke 26. Feb 2025 16:42

AW: Preview Handler für den Explorer
 
Also bei mir funktioniert das. Ich habe deinen Quelltext 1:1 verwendet. Hast du die DLL auch umbenannt oder nur die Unit? Und hast du die Original-DLL des Demoprojekts auch wieder deregistriert?

bcvs 26. Feb 2025 17:15

AW: Preview Handler für den Explorer
 
Ich habe das Projekt umbenannt, also auch die DLL. Ja, und immer wieder deregistriert.

Delphi-Quellcode:
library INZPreviewHandler;

uses
  ComServ,
  PreviewHandler in 'PreviewHandler.pas' {PreviewHandler: CoClass},
  MyINZPreviewHandler in 'MyINZPreviewHandler.pas';

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer,
  DllInstall;

{$R *.RES}

begin
end.

jaenicke 26. Feb 2025 20:37

AW: Preview Handler für den Explorer
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal das Projekt angehängt. Ich habe zwar keine Idee, wo der Unterschied sein könnte, aber wer weiß...

bcvs 27. Feb 2025 07:42

AW: Preview Handler für den Explorer
 
Jetzt wird es immer bunter:

Auf einigen VMs (Windows 10, und 11) funktioniert es auch bei mir. Auf einem anderen realen Computer (ehemaliger Entwicklungs-PC) allerdings wieder nicht.

Und wenn ich auf meinem aktuellen Entwicklungs-PC eine Vorschau für eine unverfängliche Endung .xxx registriere, funktioniert es auch da. Es muss also irgendwas mit diesem .inz zu tun haben.

Delphi.Narium 27. Feb 2025 07:49

AW: Preview Handler für den Explorer
 
Durchsuche bitte mal die Registry nach der Dateiendung .inz, inzfile und den GUIDs. Eventuell sind dort noch Reste von vorherigen Versuchen enthalten, so dass eine erneute Verwendung scheitert.

jaenicke 27. Feb 2025 08:15

AW: Preview Handler für den Explorer
 
Der Zweig .inz sollte direkt unter HKEY_CLASSES_ROOT liegen.

bcvs 27. Feb 2025 08:57

AW: Preview Handler für den Explorer
 
Ich glaube, jetzt habe ich es.

Auf den beiden Entwicklungsrechnern wurde der Dateityp .inz irgendwann einmal über den Explorer - Öffnen mit - Immer - verknüpft.

Wenn man das macht, funktioniert der Preview nicht. Wird der Dateityp dagegen offiziell über ein Installationsprogramm an die entsprechenden Stellen in HKCR eingetragen, ist alles in Ordnung.

Also habe ich jetzt in der Registry als Administrator alles, was nach .inz aussieht, gelöscht, Rechner neu gestartet, Preview-DLL registriert und es funktioniert.

bcvs 3. Mär 2025 09:49

AW: Preview Handler für den Explorer
 
Mittlerweile habe ich das Preview am Laufen. Mit Innosetup klappt auch die Installation samt Registrierung der dll und Eintrag des Dateityps in die Registry zwecks Öffnen der Anwendung ganz gut.

Ein Problem gibt es nur, wenn die Dll beim nächsten Update überschrieben werden soll. Da der Installer meistens über den Explorer gestartet wird, ist die DLL in Preview Handler Surrogate Host geöffnet und kann nicht überschrieben werden.

In Innosetup gibt es dazu zwar das Flag restartreplace, das scheint aber nicht richtig zu funktionieren. Hat bei mir jedenfalls keinen Effekt.

Wie macht ihr das? Installation einer DLL, die gerade in Benutzung ist:

Uwe Raabe 3. Mär 2025 10:36

AW: Preview Handler für den Explorer
 
Zitat:

Zitat von bcvs (Beitrag 1546730)
In Innosetup gibt es dazu zwar das Flag restartreplace, das scheint aber nicht richtig zu funktionieren. Hat bei mir jedenfalls keinen Effekt.

Das Setup wird aber schon als Admin gestartet?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:05 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz