...DDEを使った方法ですが、Acrobat X から、DDEのサービス名が変更されています。...
uses {$IF RTLVersion >= 23.00} Winapi.Windows, System.SysUtils, System.Win.Registry, System.AnsiStrings, Vcl.DdeMan; {$ELSE} Windows, SysUtils, Registry, {$IFDEF UNICODE}AnsiStrings, {$ENDIF}DdeMan; {$IFEND} function GetAcrobatPathname: String; begin with TRegistry.Create do begin try RootKey := HKEY_CLASSES_ROOT; OpenKeyReadOnly('Software\Adobe\Acrobat\Exe'); try Result := AnsiDequotedStr(ReadString(''),'"'); finally CloseKey; end; finally Free; end; end; end; procedure OpenPDF(const Filename: String; Page: Integer); const CDdeCommand: AnsiString = '[DocOpen("%s")][DocGoTo(NULL,%d)]'; var Macro: AnsiString; Pathname: String; ServiceName: String; MajorVersion: Integer; AcrobatType: String; begin Macro := {$IFDEF UNICODE}{$IF RTLVersion >= 23.00}System.{$IFEND}AnsiStrings.{$ENDIF} Format(CDdeCommand,[Filename,Page - 1]); Pathname := GetAcrobatPathname; ServiceName := 'Acroview'; MajorVersion := GetFileVersion(Pathname) shr 16; if MajorVersion >= 10 then begin if CompareText(ExtractFileName(Pathname),'AcroRd32.exe') = 0 then begin AcrobatType := 'R'; end else begin AcrobatType := 'A'; end; ServiceName := ServiceName + Format('%s%d',[AcrobatType,MajorVersion]); end; with TDdeClientConv.Create(nil) do begin try ConnectMode := ddeManual; ServiceApplication := ChangeFileExt(Pathname,''); SetLink(ServiceName,'Control'); if (OpenLink or ((MajorVersion >= 15) and OpenLink)) = True then begin ExecuteMacro(PAnsiChar(Macro),False); CloseLink; end; finally Free; end; end; end;Acrobat/Readerの実行ファイルの場所をレジストリの"HKEY_CLASSES_ROOT\Software\Adobe\Acrobat\Exe"から取得し、SysUtils.GetFileVersionで問い合わせたバージョン情報の上位16ビット(メジャーバージョン)とファイル名からサービス名を組み立て、DDEをTDdeClientConv.OpenLinkで呼び出してTDdeClientConv.ExecuteMacroでマクロ実行することでファイルを開きページを移動する、という手順になります。またAcrobat/Reader DCの場合TDdeClientConv.OpenLinkの内部でWinExec(en)を使用して起動した直後にDdeConnect(en)を呼び出すと失敗するようなので、リトライするようにしています。
おかぽんさん、情報ありがとうございました。
→Adobe Reader(X以降)で指定したファイルの指定したページを開く(Gist)
0 件のコメント:
コメントを投稿