发布
社区首页 >问答首页 >Delphi -打开带有参数的PDF,而不为阅读器应用程序提供默认路径。

Delphi -打开带有参数的PDF,而不为阅读器应用程序提供默认路径。
EN

Stack Overflow用户
提问于 2015-05-23 07:53:35
回答 3查看 5.4K关注 0票数 2

我有一个问题,打开pdf文件从德尔菲。我需要打开参数pdf,因为我想为我的程序创建帮助手册。我尝试使用shellExecute,但是这个函数需要阅读路径pdf。

代码语言:javascript
代码运行次数:0
复制
procedure TForm3.Button2Click(Sender: TObject);
var e,s:String;
begin
   s:='/A nameddest=somePlaceInPDF pathToMyFile.pdf';
   e:='AcroRd32';
   ShellExecute(handle,'open',pchar(e),pchar(s),nil,sw_show);
end;

程序在运行,但对我来说不是一个解决方案。一些用户可以使用其他pdf阅读器。您知道跳过添加读取器路径的方法吗?

另一种方式是

代码语言:javascript
代码运行次数:0
复制
if ShellExecute(handle,'open',pchar(e),pchar(s),nil,sw_show) < 32 then
  begin
  ShellExecute(0,0,'rundll32.exe','shell32.dll,OpenAs_RunDLL pathToMyFile.pdf',0,SW_SHOW);
  end;

我认为,我需要一些方法,从pdf阅读器中提取路径。这是解决这个问题的最好办法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-25 15:10:59

这是对我问题最好的回答。

代码语言:javascript
代码运行次数:0
复制
procedure TForm3.Button2Click(Sender: TObject);
    var s, result:String;
    path: array[0..250] of char
    begin
       s:='/A nameddest=somePlaceInPDF "pathToMyFile.pdf"';
       FindExecutable('pathToMyFile.pdf',nil,path);
       result := trim(StrPas(path));
       ShellExecute(handle,nil,pchar(result),pchar(s),nil,sw_show);
    end
票数 0
EN

Stack Overflow用户

发布于 2015-05-23 08:18:30

如果希望将参数传递给可执行文件,则将忽略任何关联,并要求存在特定的可执行文件。因为特定的参数只对一个特定的可执行文件有效。也就是说,Foxit不理解Acrobat的参数,反之亦然。

在这种情况下,您应该使用CreateProcess调用它。要找到Acrobat的可执行文件,请参考以下问题:如何获得Adobe完整路径(包括可执行文件名)?对于其他PDF程序也有类似的方法。

ShellExecute的真正意义在于它理解文件关联的系统和用户首选项。shell知道应该使用哪个应用程序打开不同的文件类型,以及在哪里找到该应用程序。

一般来说,如果您知道可执行文件的位置,请使用CreateProcess。如果您知道文档的位置并希望系统找到可执行文件,请使用ShellExecute(Ex)

因此,将PDF文件的完整路径传递给ShellExecute,让系统找到并打开相关的应用程序。

代码语言:javascript
代码运行次数:0
复制
ShellExecute(0, 'open', PChar(PdfFileName), nil, nil, SW_SHOW);

如果您希望有正确的错误处理,请使用ShellExecuteEx。您还可以将'open'替换为nil,并让系统选择默认操作。

票数 2
EN

Stack Overflow用户

发布于 2016-02-09 01:50:06

pdf文件可能与另一个程序相关联,因此"FindExecutable“并不是找到已安装的Acrobat程序的可靠方法。我使用注册表项: HKEY_CLASSES_ROOT\Software\Adobe\Acrobat\Exe

代码语言:javascript
代码运行次数:0
复制
procedure TfrmFsYtd.btnPdfHelpTestClick(Sender: TObject);
var strAcro, strParam:string;
    Registry: TRegistry;
begin
  // Get the users' installed Adobe Reader from the registry >>
  Registry:=TRegistry.Create;
  Registry.RootKey:=HKEY_CLASSES_ROOT;
  Registry.OpenKey('Software\Adobe\Acrobat\Exe',False);
  strAcro :=Registry.ReadString('');
  Registry.Free;
  // Use the installed Adobe Reader to open your pdf- help- file at a specific page >>
  strParam := ' /A page=4 "'+ProgPath+'FsYtd_Manual.pdf"';
  ShellExecute(Handle, 'open', PChar(strAcro), PChar(strParam),nil, SW_SHOWNORMAL);
end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30410327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档