Delphi Adobe X启动时启用保护模式-通过代码禁用
我们的应用程序是用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之后的注释所述)—它可以工作。为什么,当你从一个打开的对话框中获取文件名时,它会起作用-注意,我不是从对话框中打开文件-我获取文件名,并将其作为一个参数来执行 更新的代码示例 当用户单击“生成报告”按钮时,报告在生成后自动打开。除此之外,还有一个网格,显示该用户到目前为止生成的所有报告-这是双击该网格时的代码: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文件是在我们的服务器应用程
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;