如何通过Delphi 2009打开PDF文件(使用Windows默认程序Adobe Reader)?

3
基本上,当我尝试打开Windows默认使用Adobe Reader打开的PDF文件时,什么也不会发生。如果我将默认程序设置为Internet Explorer,则可以正常打开。
以下是我的代码:
var
openDialog : TOpenDialog;    // Open dialog variable
begin
  openDialog := TOpenDialog.Create(self);
  openDialog.InitialDir := MaskEditLocation.Text;
  if openDialog.Execute then
   ShellExecute(Handle, PChar('Open'), PChar(openDialog.FileName), nil, nil,
   SW_SHOWNORMAL);
  openDialog.Free;
end;

有什么想法吗?

感谢您的帮助!


很久以前,我记得如果在调试应用程序时调用ShellExecute,Acrobat Reader就无法正常工作,但是当应用程序以“正常”方式运行时,它可以正常工作。 - Rob Kennedy
1个回答

20

当你想使用默认行为时,永远不要假设应用程序已经注册了特定的动词,比如open或者run。当你想使用默认行为时,只需将动词留空,让Windows自己决定即可:

ShellExecute(Handle, nil, PChar(OpenDialog.FileName), nil,  nil, SW_SHOWNORMAL);

我会使用 “open” …没有理由不使用“open”动词。我看不出这种做法和他目前所做的有什么区别。 - GDF
2
@GDF:请仔细阅读我的回答。并非所有应用程序都定义了“open”动词,而且“open”可能不是默认选项。请认真阅读我写的话 :-) 此外,请自行阅读MSDN关于ShellExecute的文档(区别在于ShellExecute的第二个参数)。就像我说的那样,如果您想要默认行为,请将动词留空,Windows会自动给您提供默认行为(与在Windows资源管理器中双击文件得到的结果相同)。 - Ken White
我明白你的意思,所以如果Adobe Reader没有定义一个“打开”,那么这将与双击相同。然而,由于我知道Adobe Reader定义了“打开”,以及其他动词,这似乎对我来说是一个奇怪的回应... ...一切都好... - GDF
@GDF,主要的区别在于Acrobat Reader实际上以这种方式打开文件,而原问题的方式则不会。 :-) 我所指的是一般规则,而不是特定于Reader - 如果您想要默认行为,请不要要求特定操作。 - Ken White
很好知道我可以把动词留空,让Windows自己决定。它运行得非常好!谢谢大家! - Trevor
在2018年,但使用Delphi 7和XP,所以这很重要。我还删除了“打开”,现在神奇地工作了(Foxit阅读器)。 - ZioBit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接