Delphi AdobePDF预览处理程序延迟

Delphi AdobePDF预览处理程序延迟,delphi,pdf,delphi-xe,Delphi,Pdf,Delphi Xe,我正在使用DelphiXE中的IPreviewHandler界面查看Adobe PDF文件列表。 除了第一个视图关闭时界面被破坏外,其他一切都正常工作,有大约20秒的长延迟。 所有后续视图正常进行,无延迟, 当然,直到我重新启动应用程序 有人经历过这种奇怪的行为吗?原因是什么 该问题可在另一台机器上由另一个开发人员重现。 OS是Windows 7的终极版,Adobe Reader席是V1.1 0.3../P> CLSID=“{DC6EFB56-9CFA-464D-8880-44885D7DC19

我正在使用DelphiXE中的IPreviewHandler界面查看Adobe PDF文件列表。 除了第一个视图关闭时界面被破坏外,其他一切都正常工作,有大约20秒的长延迟。 所有后续视图正常进行,无延迟, 当然,直到我重新启动应用程序

有人经历过这种奇怪的行为吗?原因是什么

该问题可在另一台机器上由另一个开发人员重现。 OS是Windows 7的终极版,Adobe Reader席是V1.1 0.3../P> CLSID=“{DC6EFB56-9CFA-464D-8880-44885D7DC193}”。 代码段:

TqdPreviewControl = class(TCustomControl)
  private
    FResult   : HRESULT;
    FFileName : string;
    FLastError: string;
    FComPreviewHandler : IPreviewHandler;
    function IsOk(Ret : HRESULT) : boolean;
    function UpdatePreviewSize :boolean;
    class function GetCLSIDForFileName(AFileName: string): string; static;
    function PreviewFile :boolean;
    procedure SetFileName(const Value: string);
  protected
    procedure Resize; override;
  public
    constructor Create(AOwner :TComponent); override;
    destructor Destroy; override;
    property FileName: string read FFileName write SetFileName;
    property LastError: string read FLastError;
  end;

destructor TqdPreviewControl.Destroy;
begin
  if FComPreviewHandler <> nil then
    FComPreviewHandler.Unload;   // this helps to reduce first delay to 5 sec
  FComPreviewHandler := nil;     //! only on first destroy spends here 20 sec
  inherited Destroy;
end;

function TqdPreviewControl.PreviewFile :boolean;
var
  ACLSID: string;
  AGUID: TGUID;
  AInit: IInitializeWithStream;
  AFile: PWideChar;
  StreamAdapter : IStream;
  Stream : TMemoryStream;
  Size : TRect;
begin
  Result := false;
  FLastError := '';
  ACLSID := GetCLSIDForFileName(FFileName);
  if (ACLSID = '') then begin
    FLastError := 'No CLSID';
    Exit;
  end;

  AGUID := StringToGUID(ACLSID);
  FComPreviewHandler := CreateComObject(AGUID) as IPreviewHandler;
  if (FComPreviewHandler = nil) then
  begin
    FLastError := 'No Handler';
    Exit;
  end;

  AInit := FComPreviewHandler as IInitializeWithStream;
  Stream := TMemoryStream.Create;
  Stream.LoadFromFile(FFileName);
  StreamAdapter := TStreamAdapter.Create(Stream, soOwned);
  FResult := AInit.Initialize(StreamAdapter as IStream, STGM_READ);
  StreamAdapter := nil;

  Size := Rect(0, 0, Width, Height);
  if not IsOk(FComPreviewHandler.SetWindow(Handle, Size)) then
    Exit;
  if not UpdatePreviewSize then
    Exit;

  if IsOk(FComPreviewHandler.DoPreview) then
    Result := true;
end;
更新:找到了一个有用的方法-卸载,这将延迟从20秒减少到5秒

更新:进一步的消息处理将Application.ProcessMessages置于析构函数中,这允许所属窗体毫不延迟地关闭,但延迟会传输到父窗体,父窗体将冻结5秒。仍然比必须在半更新状态下查看关闭视图的视觉效果稍好

更新:使用Foxit预览处理程序确认延迟确实是Adobe和
与Delphi代码完全无关

仅供参考自7月1日起,PDF文件格式不再是Adobe的2008@Sam谢谢你指出,根据维基百科,Adobe给每个人一个免费的许可证,你应该更新你的问题,但在阅读之前