Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Adobe X启动时启用保护模式-通过代码禁用_Delphi_Windows 7_Windows Vista_Adobe Reader - Fatal编程技术网

Delphi Adobe X启动时启用保护模式-通过代码禁用

Delphi Adobe X启动时启用保护模式-通过代码禁用,delphi,windows-7,windows-vista,adobe-reader,Delphi,Windows 7,Windows Vista,Adobe Reader,我们的应用程序是用Delphi编写的,它生成一系列报告,大多数是PDF格式的,在生成报告时会自动打开。 Adobe X引入了一个默认启用的功能“启动时启用受保护模式”。 使用“ShelExecute”打开报告pdf文件 由于此新的Adobe Reader新设置,在Win 7或Vista下,我们在打开文档时会收到一条错误消息。双击文档打开它不会出现任何问题。 有没有一种方法可以禁用受保护的方法?或者有没有另一种方法可以打开文档而不出现错误(解决方法) *更多信息* PDF文件是在我们的服务器应用程

我们的应用程序是用Delphi编写的,它生成一系列报告,大多数是PDF格式的,在生成报告时会自动打开。 Adobe X引入了一个默认启用的功能“启动时启用受保护模式”。 使用“ShelExecute”打开报告pdf文件

由于此新的Adobe Reader新设置,在Win 7或Vista下,我们在打开文档时会收到一条错误消息。双击文档打开它不会出现任何问题。 有没有一种方法可以禁用受保护的方法?或者有没有另一种方法可以打开文档而不出现错误(解决方法)

*更多信息*

PDF文件是在我们的服务器应用程序上生成的,流式传输到客户端,客户端生成PDF(使用Write)——首先我认为这可能是问题所在——但是,为什么双击可以正常工作呢

我已经创建了一个虚拟应用程序,除了使用上面相同的代码打开pdf外,它什么也不做,并且可以正常工作。我已经检查了应用程序的权限-所有这些都是一样的-唯一的区别是,一个不工作的应用程序正在使用正确的安装程序安装到操作系统上-另一个(虚拟应用程序)是我刚刚创建的,并放在那里

其中一条评论询问了文件关联-这不应该是一个问题,因为应用程序成功启动了Adobe reader-Adobe reader随后向我发出“拒绝访问”错误消息。双击同一个文件就可以了

新西兰时间2011年3月30日下午2:50新西兰时间

我对代码进行了更改,只是为了测试应用程序本身和虚拟应用程序之间的唯一区别。 它不再自动获取文件路径和文件名,而是打开一个OpenDialog—OpenDialog的Filename属性用作ShellExecute的参数(正如Ken answer之后的注释所述)—它可以工作。为什么,当你从一个打开的对话框中获取文件名时,它会起作用-注意,我不是从对话框中打开文件-我获取文件名,并将其作为一个参数来执行

更新的代码示例

当用户单击“生成报告”按钮时,报告在生成后自动打开。除此之外,还有一个网格,显示该用户到目前为止生成的所有报告-这是双击该网格时的代码:

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;
如果GetSelectedReport nil,则//这将检查用户是否选择了报告
如果[risGenerated,risview]中的TReportItemState(GetSelectedReport.State),则//检查所选报告是否处于要显示的正确状态。
开始
文件名:=TClientReportManager.Singleton.Directory+'\'+GetSelectedReport.fileName;//带有filePath+fileName的字符串
ShellExecute(0,'打开',pchar(文件名),'','',SW_最大化);//命令打开该文件
结束;
我对Opendialog工作的第一个猜测是,Opendialog更改了CurrentDir,因此我已经尝试使用SetCurrentDir和ChDir将当前目录更改为文件所在的目录。没有成功


在Win7下,文件路径被转换为C:\Users\Ronaldo\Documents\CompanyName\AppName

我不认为您可以在代码中完全禁用它;如果可以,它将破坏受保护模式的全部用途(防止恶意软件利用.pdf文件关联)。不过,您可以通过合法的方式解决此问题。:)

我怀疑这与您在
ShellExecute
中使用的
open
动词有关。您假设(可能错误地)Win7上的
open
动词在受保护模式下的作用与Adobe Reader和Windows的早期版本相同。(注意:我的系统上没有安装该版本的Acrobat;这只是猜测。)

我要尝试的第一件事是将调用更改为
ShellExecute
,如下所示:

ShellExecute(0, nil, PChar(pdfFile), nil, nil, SW_NORMAL);
第一个更改是将
nil
作为第二个参数传递。这会告诉Windows您希望执行任何默认操作。例如,这可能是
视图
,而不是
打开

我还将文件名后的两个参数也更改为nil。这比使用空字符串(“”)更具可读性

最后一个参数发生了变化;我通常使用
SW_NORMAL
而不是
SW_SHOW
,原因很简单,这告诉Windows以默认大小和位置显示它;这可能是应用程序保存的内容,并将影响用户的首选项(如果有)

如果这不起作用,是时候在Windows注册表中四处走动(小心!!)。在开始菜单的搜索控件中打开
regedit
,然后导航到HKEY_CLASSES_ROOT。向下滚动文件扩展名,直到找到
.pdf
的条目,然后双击该分支。您将看到
默认值
,它是(无论如何,在我的系统上)
AcroExch.Document
,内容类型为
application/pdf

继续沿着左窗格中的树向下,直到找到
AcroExch.Document
,然后展开它。您将在那里看到一些值(同样,从我的机器上),如下图所示。展开
Shell
分支,您将看到已定义的谓词以及与它们关联的命令。在我的机器上(同样),我有一个
Open
动词,其命令设置为
“C:\ProgramFiles(x86)\Adobe\Reader 9.0\Reader\AcroRd32.exe”“%1”“

(耐心点,我们就快到了,我保证。)

您可以通过检查默认值(单击左侧窗格中的
Shell
,然后查看右侧设置为
(默认)
)的内容来查看双击的不同之处。然后检查命令行(在上面的第二幅图中,它是
打开的
),以查看switc是什么
ShellExecute(0, nil, PChar(pdfFile), nil, nil, SW_NORMAL);
ShellExecute(0, nil, PChar(pdfFile), PChar('/v'), nil, SW_NORMAL);
function GetSpecialFolderPath(folder : integer) : string;
const
  SHGFP_TYPE_CURRENT = 0;
var
  path: array [0..MAX_PATH] of char;
begin
  if SUCCEEDED(SHGetFolderPath(0,folder,0,SHGFP_TYPE_CURRENT,@path[0])) then
    Result := path
  else
    Result := '';
end;