1

いくつかの Web サービスを提供する Delphi Web サーバーを持っています*。それらの 1 つは、PDF レポートを生成して返すことになっています。

PDF の作成は QReport で行われ、次に ExportToFilter プロシージャで PDF ファイルにエクスポートされます。

このルーチンは、アプリケーション内から呼び出されると正常に動作しますが、TIdTCPServer の背後で呼び出されると、ハングして終了しません。それをデバッグすると、ぶら下がっているポイントがわかりました:

(注:私は今家にいて、ソースコードを持っていません。覚えている限り正確にquickrpt.pasのソースを再現しようとします).

procedure TCustomReport.ExportToFilter(TQRDocumentFilter filter);
  ...
  AProgress := TQRFormProgress.Create(Application); // Hangs on this line
  AProgress.Owner := QReport;
  if ShowProgress then AProgress.Show;
  QReport.Client := AProgress;
  ...

Web を検索すると、このページ(1) で、ShowProgress を False に設定し、ShowProgress が false に設定されているときに進行状況フォームを作成しないようにコードを編集するという提案が見つかりました (明らかに、これは QReport がスレッドセーフではないためです)。 )。

それで、コードを編集したところ、次のようになりました。

procedure TCustomReport.ExportToFilter(TQRDocumentFilter filter);
  ...
  if ShowProgress then
  begin
    AProgress := TQRFormProgress.Create(Application);
    AProgress.Owner := QReport;
    AProgress.Show;
    QReport.Client := AProgress
  end;
  ...

さて、レポートが出てきました。しかし、その後、サービスは無効なポインター例外に到達します (これは追跡できません)。サービスへの次の呼び出しは正常に完了しますが、サービスをシャットダウンすると**、無効なポインター例外で再び泣き言を言い始め、「MyServer has commited an invalid action and must be closed (MyServer has commited an invalid action and must be closed (MyServer は無効なアクションをコミットしたため、閉じる必要があります)] ウィンドウ メッセージが再び数回表示されます) 、次にポインター例外だけが発生し、エラー216になります(これは、私が知る限り、Windowsアクセス許可に関連しています)。

ありがとう!

更新 (1 月 5 日) : Scott W. さん、ご回答ありがとうございます。実際、いくつかの調査の後、メイン スレッドのみが一部のコンポーネントにアクセスできるという別の提案を見つけました。そこで、QR コードを通常の状態に戻し、TThread 内の Synchronize 呼び出しからメイン メソッドを呼び出しました (メイン スレッドがそれを処理するように)。しかし、私はまだ同じエラーが発生します。

あなたは、QR 4 でサービスとして PDF を生成できたと述べています。QR 3 を使用しているため、おそらくそれが私にとってはうまくいかない理由です。 TIdTCPServer (これは私の場合で、Web サービスを提供します) または単独で実行する場合 (たとえば、バッチ プロセス中)。

私のQRバージョンが問題であるかどうか知っている人はいますか? ありがとう!

* Windows XP SP2 で Delphi 7 と QuickReport 3 を実行しています。サーバーは Indy をベースにしています。

** サーバーには、Windows アプリケーションと Windows サービスの 2 つのバージョンがあります。どちらも同じ内部ロジックを呼び出し、両方のバージョンで問題が発生します。

更新 (3 月 8 日) : 結局、私の問題は、私の印刷ルーチンが別の dll にあり、デフォルトのメモリ管理モジュールがやや安っぽいことでした。.dpr の最初の使用を ShareMem に設定すると、メモリ管理モジュールが Borland の実装で上書きされ、問題が解決しました。

uses
    ShareMem, ...

(1): http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.thirdpartytools.general/2006-09/msg00013.html

4

1 に答える 1

1

コードの後半のどこかでそれQReport.Clientが使用されていると思いますが、変更されたコードがそれを AProgress に割り当てていないため、エラーが発生します。

QuickReport ソースを変更する必要がありますか? Windows サービスで QuickReport を使用して PDF ファイルを生成し、電子メール メッセージに添付しましたが、QR ソースを変更しなくてもすべて正常に機能しました。どの設定を行う必要があったか正確には覚えていませんが、Delphi 6 と QR 4.06 で行われました。

于 2009-01-04T22:15:46.000 に答える