AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IPreviewHandler mit Delphi 7 anbinden!?

Ein Thema von Sushibb · begonnen am 29. Aug 2008 · letzter Beitrag vom 5. Sep 2008
Antwort Antwort
Sushibb

Registriert seit: 28. Jul 2004
13 Beiträge
 
Delphi 6 Personal
 
#1

IPreviewHandler mit Delphi 7 anbinden!?

  Alt 29. Aug 2008, 20:58
Hi @all,

ich habe versucht, in einem Tool das von Windows Vista, Office 2007 bzw Windows Search 4 bereitgestellte Interface für den PreviewHandler zu nutzen. Leider zeigt das Programm nichts an, obwohl ich als Rückgabewert keine Fehler erhalte. Kennt sich jemand damit aus?

Nachfolgend der Code. Es müsste nur ein neues Projekt und ein Button1 erstellt werden, dann sollte es schon laufen.

Bin für jeden Hinweis dankbar.

Achso, ich hab das Codebeispiel der MSDN in C# heruntergeladen und das funktioniert. Liegt also nicht an fehlenden Dateien oder OS-Unterstützung!

Code:
unit FMain;

{
[url]http://dedjo.blogspot.com/2008/04/using-vista-preview-handlers-in-wpf[/url]...
[url]http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/07.aspx[/url]
[url]http://blogs.microsoft.co.il/blogs/eyal/archive/2007/07.aspx[/url]

}

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
  Dialogs, StdCtrls, ExtCtrls, OleServer;

type
  TPreviewControl = class(TCustomControl)
  private
    FFileName: string;
    FLastError: string;
    procedure SetFileName(const Value: string);
    procedure PreviewFile;
  public
    property FileName: string read FFileName write SetFileName;
    property LastError: string read FLastError;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FPreview: TPreviewControl;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Registry, ComObj, ActiveX, ShlObj;

type
  IPreviewHandler = interface(IUnknown)
    ['{8895b1c6-b41f-4c1c-a562-0d564250836f}']
    function DoPreview(): HRESULT; stdcall;
    function QueryFocus(phwnd: HWND): HRESULT; stdcall;
    function SetFocus(): HRESULT; stdcall;
    function SetRect(var RectangleRef: TRect): HRESULT;  stdcall;
    function SetWindow(hwnd: HWND; var RectangleRef: TRect): HRESULT;
stdcall;
    function TranslateAccelerator(PointerToWindowMessage: MSG):
HRESULT; stdcall;
    function Unload(): HRESULT; stdcall;
  end;

   IInitializeWithFile = interface(IUnknown)
     ['{b7d14566-0509-4cce-a71f-0a554233bd9b}']
     function Initialize(pszFilePath: LPWSTR; grfMode: DWORD):HRESULT;
stdcall;
   end;

  IInitializeWithStream = interface(IUnknown)
    ['{b824b49d-22ac-4161-ac8a-9916e8fa3f7f}']
    function Initialize(pstream: IStream; grfMode: DWORD): HRESULT;
stdcall;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  AFileName: string;
begin
  with TOpenDialog.Create(Self) do
  try
    if not Execute then
      Exit;
    AFileName := FileName;
  finally
    Free;
  end;

  FPreview.FileName := AFileName;
  Caption := FPreview.LastError;
end;

function GetCLSIDForFileName(AFileName: string): string;
var
  AREG: TRegistry;
  AFileExt, ARegistryPath: String;
  vNames: TStringList;
begin
  vNames := TStringList.Create();
  AREG := TRegistry.Create();
  try
    AREG.RootKey := HKEY_CLASSES_ROOT;
    AFileExt := ExtractFileExt(AFileName);
    ARegistryPath := AFileExt + '\shellex\{8895b1c6-b41f-4c1c-
a562-0d564250836f}';
    if AREG.KeyExists(ARegistryPath) then
    begin
      AREG.OpenKey(ARegistryPath, True);
      AREG.GetValueNames(vNames);
      Result := AREG.ReadString(vNames[0]);
      AREG.CloseKey;
    end
    else
      Result := '';
  finally
    FreeAndNil(vNames);
    FreeAndNil(AREG);
  end;
end;

{ TPreviewControl }

procedure TPreviewControl.PreviewFile;
var
  ACLSID: string;
  AGUID: TGUID;
  AMyPreviewHandler: IPreviewHandler;
  ARect: TRect;
  AInit: IInitializeWithFile;
  AResult: HRESULT;
  AFile: PWideChar;
begin
  FLastError := '';
  ACLSID := GetCLSIDForFileName(FFileName);
  if ACLSID = '' then
  begin
    FLastError := 'No CLSID';
    Exit;
  end;

  AGUID := StringToGUID(ACLSID);
  ARect := Rect(0, 0, Width, Height);
  AMyPreviewHandler := CreateComObject(AGUID) as IPreviewHandler;
  if (AMyPreviewHandler = nil) then
  begin
    FLastError := 'No Handler';
    Exit;
  end;

  AGUID := StringToGUID('{b7d14566-0509-4cce-a71f-0a554233bd9b}');
  if not Supports(AMyPreviewHandler, AGUID, AInit) then
  begin
    FLastError := 'Support';
    Exit;
  end;

  GetMem(AFile, 1024);
  AFile := StringToWideChar(FFileName, AFile, 1024);
  AResult := AInit.Initialize(AFile, STGM_READ);
  if AResult <> 0 then
  begin
    FLastError := 'Initialize';
    Exit;
  end;

  AResult := AMyPreviewHandler.SetWindow(Self.Handle, ARect);
  if AResult <> 0 then
  begin
    FLastError := 'SetWindow';
    Exit;
  end;

  AResult := AMyPreviewHandler.SetRect(ARect);
  if AResult <> 0 then
  begin
    FLastError := 'SetRect';
    Exit;
  end;

  AResult := AMyPreviewHandler.DoPreview;
  if AResult <> 0 then
  begin
    FLastError := 'DoPreview';
    Exit;
  end;
end;

procedure TPreviewControl.SetFileName(const Value: string);
begin
  FFileName := Value;
  PreviewFile;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FPreview := TPreviewControl.Create(Self);
  FPreview.ParentColor := False;
  FPreview.ParentBackground := False;
  FPreview.Top := 10;
  FPreview.Left := 10;
  FPreview.Width := 200;
  FPreview.Height := 200;
  FPreview.Parent := Self;
end;

end.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: IPreviewHandler mit Delphi 7 anbinden!?

  Alt 29. Aug 2008, 21:19
Was schreibt er denn in deine Form-Caption?

Bei mir springt er gleich hier raus...
Delphi-Quellcode:
procedure TPreviewControl.PreviewFile;
:
begin
:
  ACLSID := GetCLSIDForFileName(FFileName);
  if ACLSID = 'then
  begin
    FLastError := 'No CLSID';
    Exit;
  end;
Weil bei mir der folgende Schlüssel nicht existiert...
    ARegistryPath := AFileExt + '\shellex\{8895b1c6-b41f-4c1c-a562-0d564250836f}'; Also steht bei mir: No CLSID
  Mit Zitat antworten Zitat
Sushibb

Registriert seit: 28. Jul 2004
13 Beiträge
 
Delphi 6 Personal
 
#3

Re: IPreviewHandler mit Delphi 7 anbinden!?

  Alt 29. Aug 2008, 21:27
Bei mir bleib die Form-Caption leer. Der Schlüssel ist da, wie gesagt mit C#-Beispiel läufts auch. Hast du Vista? XP + Windows Search 4? Office 2007?
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: IPreviewHandler mit Delphi 7 anbinden!?

  Alt 29. Aug 2008, 21:32
Ich habe XP und keine dieser neuen Funktionen. Ich habe einfach mal einen Breakpoint gesetzt und mir angesehen, was da so passiert. Wenn ich eine Datei auswähle, wird das PreviewFile-Event ausgelöst und in der Routine habe ich dann das beschriebene und nicht wirklich unerwartete Verhalten.
Keine Ahnung warum sich bei dir nicht mal die Form-Caption ändert. Was passiert den bei dir? Setze doch einfach mal einen Breakpoint und schau nach...
  Mit Zitat antworten Zitat
Sushibb

Registriert seit: 28. Jul 2004
13 Beiträge
 
Delphi 6 Personal
 
#5

Re: IPreviewHandler mit Delphi 7 anbinden!?

  Alt 29. Aug 2008, 21:44
AResult ist immer 0, was so schlecht erstmal nicht klingt, da dies ein 'OK' sein sollte. Auf der Form ändert sich nichts. Die Caption bleibt leer, weil FLastError nur gesetzt wird, wenn AResult != 0 ist.
  Mit Zitat antworten Zitat
Sushibb

Registriert seit: 28. Jul 2004
13 Beiträge
 
Delphi 6 Personal
 
#6

Re: IPreviewHandler mit Delphi 7 anbinden!?

  Alt 5. Sep 2008, 09:45
Hat keiner eine Idee? Funktionierts bei euch denn?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz