私たちのアプリケーションは 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 ファイルはサーバー アプリケーションで生成され、クライアントにストリーミングされ、クライアントは (Write を使用して) PDF を生成します。
上記の同じコードを使用してpdfを開くだけのダミーアプリを作成しましたが、機能します。私はアプリケーションの権限を確認しました - すべて同じです - 唯一の違いは、動作していないものは適切なインストーラーを使用して OS にインストールされていることです - もう一方 (ダミーのもの) は作成してそこにドロップしました。
コメントの 1 つがファイルの関連付けについて尋ねます - アプリケーションが 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 に変換されます。