我们的应用程序用 Delphi 编写,生成一系列报告,其中大部分是 PDF 格式,生成时会自动打开。Adobe X 引入了一项默认启用的功能“启动时启用保护模式”。报告 pdf 文件使用“ShelExecute”打开。
var
pdfFile: string;
begin
pdfFile := 'C:\Users\Ronaldo\Documents\appName\reports\file.pdf';
ShellExecute(0, 'open', PChar(pdfFile), '', '', SW_SHOW);
//
end;
由于这个新的 Adobe Reader 新设置,在 Win 7 或 Vista 下,我们在打开文档时收到错误消息。双击文档打开它不会有任何问题。有没有办法禁用受保护的方法 - 或另一种方法来打开文档而不会出现错误(解决方法)?
*更多信息 *
PDF文件正在我们的服务器应用程序上生成,流式传输到客户端,客户端生成pdf(使用Write) - 首先我虽然这可能是问题 - 但再次,为什么双击工作正常。
我创建了一个虚拟应用程序,除了使用上面相同的代码打开 pdf 之外什么都不做,它可以工作。我已经检查了应用程序的权限 - 都是一样的 - 唯一的区别是使用正确的安装程序在操作系统上安装了一个不工作的应用程序 - 我刚刚创建并把它放在那里的另一个(虚拟的)。
其中一条评论询问了文件关联 - 这应该不是问题,因为应用程序成功启动了 Adobe reader - Adobe reader 然后给了我“拒绝访问”错误消息。双击同一个文件可以正常工作。
新信息 - 2011 年 3 月 30 日 - 下午 2:50 - 新西兰时间
我对代码进行了更改,只是为了测试应用程序本身和虚拟应用程序之间的唯一区别。现在,它不是自动获取文件路径和文件名,而是打开一个 OpenDialog - opendialog 的 Filename 属性用作 ShellExecute 的参数(如 Ken 回答后的注释所述) - 它可以工作。为什么会这样,当您从打开的对话框中获取文件名时,它可以工作 - 请注意,我没有从对话框中打开文件 - 我正在获取文件名,并将其用作 ShellExecute 的参数。
更新的代码示例
当用户点击“生成报告”按钮时,报告生成后自动打开。除此之外,还有一个网格,显示了迄今为止为该用户生成的所有报告 - 这是该网格双击的代码:
if GetSelectedReport <> nil then // this will check if the user selected an report
if TReportItemState(GetSelectedReport.State) in [risGenerated,risViewed] then // checks if the report selected is in the correct state to be displayed.
begin
fileName := TClientReportManager.Singleton.Directory+'\'+GetSelectedReport.Filename; // a string with the filePath + fileName
ShellExecute(0, 'open', pchar(fileName), '','', SW_MAXIMIZE); // command to open the file
end;
我对 Opendialog 工作的第一个猜测是,打开的对话框会更改 CurrentDir - 所以我已经尝试使用 SetCurrentDir 和 ChDir 将当前目录更改为文件所在的目录。没有成功。
Win 7下,文件路径翻译为C:\Users\Ronaldo\Documents\CompanyName\AppName